Tor子系统——报错模块

Tor笔记目录索引

Tor报错模块位于src/lib/err/文件夹,用于监听Tor运行过程中发生的错误,并输出错误信息

子系统结构

子系统结构定义解释

const subsys_fns_t sys_torerr = {
  .name = "err",
  /* Low-level error handling is a diagnostic feature, we want it to init
   * right after windows process security, and shutdown last.
   * (Security never shuts down.) */
  .level = -99,
  .supported = true,
  .initialize = subsys_torerr_initialize,
  .shutdown = subsys_torerr_shutdown
};

初始化子系统

该系统初始化首先会将version拼接到bt_version中(类似Tor version 0.4.4.0-alpha-dev (git-a6509cb86744f8f2)的格式)

接下来会用到sigaction1,这是一个监听信号的库,当进程收到信号时,会执行对应的函数,在这里设置的是SA_SIGINFO函数,说明使用sa_sigaction对应的函数接收信号,而非sa_handler

这里会接收如下信号2 3

信号 解释
SIGSEGV 发生段错误时触发4
SIGILL 非法访问时触发
SIGFPE 算术错误如除零、溢出时触发5
SIGBUS 发生总线错误时触发6
SIGSYS 发生系统调用错误
SIGIO 发生IO错误时触发

当有以上信号发生时(错误信号),会回调src/lib/err/backtrace.cstatic void crash_handler(int sig, siginfo_t *si, void *ctx_)函数,并输出相应的回溯信息

销毁子系统

在卸载时,则会取消之前监听的信号

参考资料


  1. Linux 进程学习(四)------ sigaction 函数 ↩︎

  2. cppreference-信号 ↩︎

  3. Gityuan-Linux信号(signal)机制 ↩︎

  4. 维基百科-SIGSEGV ↩︎

  5. 维基百科-SIGFPE ↩︎

  6. 维基百科-总线错误 ↩︎