- 由某一个线程造成的
SIGSEGV|SIGFPE
的异常信号都会被递交给发起线程,文档。 - 这类信号可以通过
SA_SIGINFO
的方式获取到siginfo_t
中的,中断信号,错误代码,发送者,以及错误访问的地址。 - 在第三个参数
void*
类型的数据,一般是ucontext_t
类型,其中的gregs
存储上下文寄存器会存储RAX
是错误地址,和对应的栈信息。栈信息可以通过backtrace
函数以及backtrace_sysmbols
函数获取到同样的栈帧。 - 异常的友好处理可以使用
setjmp + longjmp
的方式,但是这种虽然可以规避异常,但是不会调用析构函数,随意,最好是做好自己的资源统计。 -
案例
#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
-
来源:oschina
链接:https://my.oschina.net/u/3695598/blog/4467460