您的位置:首页 > 其它

程序崩溃时打印调用栈

2013-07-10 12:32 162 查看
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 := callstack
obj := print_callstack.o
ldflags := -rdynamic
CC := 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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息