Linux程序异常退出打印调用堆栈

/* * 程序异常终止时打印异常程序调用堆栈 * gcc -g -rdynamic BackTraceTest.c -o BackTraceTest * * 运行程序出现错误: * System error, Stack trace: * 0 ./BackTraceTest(SystemErrorHandler+0x77) [0x40095b] * 1 /lib64/libc.so.6() [0x3a4fe326b0] * 2 ./BackTraceTest(Fun1+0x10) [0x400a10] * 3 ./BackTraceTest(Fun+0xe) [0x400a23] * 4 ./BackTraceTest(main+0x37) [0x400a5c] * 5 /lib64/libc.so.6(__libc_start_main+0xfd) [0x3a4fe1ed5d] * 6 ./BackTraceTest() [0x400829] * Segmentation fault (core dumped) * * gdb打印错误行信息 * gdb BackTraceTest * (gdb) info line *0x400a10 * Line 66 of "BackTraceTest.c" starts at address 0x400a0c <Fun1+12> and ends at 0x400a13 <Fun1+19>. * (gdb) list *0x400a10 * 0x400a10 is in Fun1 (BackTraceTest.c:66). * warning: Source file is more recent than executable. * 61} * 62 * 63void Fun1() * 64{ * 65char *p=NULL; * 66*p = 'A'; * 67} * 68 * 69void Fun() * 70{ * * * addr2line 定位程序地址对应的源代码位置 * addr2line -e BackTraceTest -i 0x400a10 * /home/cyf/workspace/BackTraceTest/BackTraceTest.c:66 * */#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<string.h>#include<execinfo.h>void SystemErrorHandler(int signum){const int len=1024;void *func[len];size_t size;int i;char **funs;signal(signum,SIG_DFL);size=backtrace(func,len);funs=(char**)backtrace_symbols(func,size);fprintf(stderr,"System error, Stack trace:\n");for(i=0;i<size;++i) fprintf(stderr,"%d %s \n",i,funs[i]);free(funs);//exit(1);}void Fun1(){char *p=NULL;*p = 'A';}void Fun(){Fun1();}int main(const int argc,const char* argv[]){signal(SIGSEGV,SystemErrorHandler); //Invaild memory addresssignal(SIGABRT,SystemErrorHandler); // Abort signalFun();return 0;}

,一个人,一条路,人在途中,心随景动,

Linux程序异常退出打印调用堆栈

相关文章:

你感兴趣的文章:

标签云: