1. 程式人生 > >linux應用異常時打印堆棧方法

linux應用異常時打印堆棧方法

ktr spa 異常終止 clas source abort a13 const recent

/*
 * 程序異常終止時打印異常程序調用堆棧
 * 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
 * 63    void Fun1()
 * 64    {
 * 65        char *p=NULL;
 * 66        *p = ‘A‘;
 * 67    }
 * 68
 * 69    void 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 address signal(SIGABRT,SystemErrorHandler); // Abort signal Fun(); return 0; }

linux應用異常時打印堆棧方法