SIGSEGV信号处理

  1. 由某一个线程造成的SIGSEGV|SIGPIPE|SIGFPE|SIGBUS的异常信号都会被递交给发起线程。
  2. 这类信号可以通过SA_SIGINFO的方式获取到siginfo_t中的,中断信号,错误代码,发送者,以及错误访问的地址。
  3. 在第三个参数void*类型的数据,一般是ucontext_t类型,其中的上下文寄存器会存储RAX是错误地址,和对应的栈信息。栈信息可以通过backtrace函数以及backtrace_sysmbols函数获取到同样的栈帧。
  4. 异常的友好处理可以使用setjmp + longjmp的方式,但是这种虽然可以规避异常,但是不会调用析构函数,随意,最好是做好自己的资源统计。
  5. 案例

    #include<execinfo.h>
    //#include<signal.h>
    #include<stdio.h>
    #define SIZE 20
    int main()
    {
        void * buf[SIZE];
        int ret = backtrace(buf,SIZE);
        char **bk = backtrace_symbols(buf,ret);
        for(int i = 0 ; i < ret ;i ++)
            printf("%s
    ",bk[i]);
        return 0;
    }
    
    • 编译指令

    g++ -rdynamic stack.cpp
    
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » SIGSEGV信号处理