SIGSEGV信号处理

╄→гoц情女王★ 提交于 2020-08-16 06:13:41
  1. 由某一个线程造成的SIGSEGV|SIGFPE的异常信号都会被递交给发起线程,文档
  2. 这类信号可以通过SA_SIGINFO的方式获取到siginfo_t中的,中断信号,错误代码,发送者,以及错误访问的地址。
  3. 在第三个参数void*类型的数据,一般是ucontext_t类型,其中的gregs存储上下文寄存器会存储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\n",bk[i]);
        return 0;
    }
    
    • 编译指令

    g++ -rdynamic stack.cpp
    
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!