程序崩溃时打印调用栈

来源:互联网 发布:php面试自我介绍 编辑:程序博客网 时间:2024/05/18 00:48

source code:#include <stdio.h>#include <signal.h>#include <stdlib.h>#include <unistd.h>#include <execinfo.h>#define PRINT_FUNC_NAME() \    printf("invocke %s\n", __func__)void func1(void){    PRINT_FUNC_NAME();    int *p = NULL;    *p = 1;}void func2(void){    PRINT_FUNC_NAME();    func1();}void func3(void){    PRINT_FUNC_NAME();    func2();}void segv_handler(int signum){    int i;    int nptrs;    void *buffer[100];    char **strings;    nptrs = backtrace(buffer, 100);    strings = backtrace_symbols(buffer, nptrs);    if(NULL == strings)    {           perror("backtrace_symbols");        return;    }       printf("call stack:\n");    for(i = 0; i < nptrs; i++)    {           printf("%s\n", strings[i]);    }       free(strings);    exit(-1);}int main(int argc, char **argv){    PRINT_FUNC_NAME();    signal(SIGSEGV, segv_handler);    func3();    return 0;}

 

makefile:

target := callstackobj := print_callstack.oldflags := -rdynamicCC := gcc LD := gcc $(target) : $(obj)    $(LD) $(ldflags) $< -o $@.c.o:    $(CC) -c $< -o $@clean:    rm *.o $(target)


程序输出:

./callstack
invocke main
invocke func3
invocke func2
invocke func1
call stack:
./callstack(segv_handler+0x25) [0x400a30]
/lib/x86_64-linux-gnu/libc.so.6(+0x364c0) [0x7f51912124c0]
./callstack(func1+0x2b) [0x4009bf]
./callstack(func2+0x20) [0x4009e7]
./callstack(func3+0x20) [0x400a09]
./callstack(main+0x3a) [0x400ae5]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f51911fd76d]
./callstack() [0x4008d9]



原创粉丝点击