直接打印堆栈调试信息
测试代码如下:
#include <stdio.h>
#include <signal.h>
//信号钩子函数,获取栈信息,然后打印
void handle_segv(int signum){
void *array[100];
size_t size;
char **strings;
size_t i;
signal(signum,SIG_DFL);
size = backtrace(array,100);
strings = (char**)backtrace_symbols(array,size);
fprintf(stderr,"Launcher received SIG:%d Stack trace:\n",signum);
for(i = 0;i <size;i++){
fprintf(stderr,"%d %s\n",i,strings[i]);
}
free(strings);
}
int func(int* p){
int y = *p;
return y;
}
int main(void){
int *p = NULL;
signal(SIGSEGV,handle_segv);
signal(SIGABRT,handle_segv);
return func(p);
}
编译:
gcc -g demo.c -o demo
执行:
**找到错误代码行号:**使用addr2line命令
示例:
addr2line -a 0x4007b6 -e demo
回到我们的源文件,对应的位置。
输入最后第一个地址会显示??:0暂时还未解决。