程序崩溃时打印调用栈
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]
#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]
相关文章推荐
- Linux调用backtrack函数打印程序崩溃时的调用堆栈
- 在C/C++程序中打印当前函数调用栈
- Linux调用backtrack函数打印程序崩溃时的调用堆栈
- linux用户态程序定位方法总结1 打印调用栈
- Linux下的C++程序崩溃时打印崩溃信息
- Linux下多线程程序崩溃时如何提取出所有线程的函数调用栈(一)
- 在C/C++程序中打印当前函数调用栈
- 在C/C++程序里打印调用栈信息
- (转载)在C/C++程序里打印调用栈信息
- linux环境在程序中打印调用栈的方法
- 在C/C++程序里打印调用栈信息
- C++ 程序崩溃调用堆栈打印
- 在C/C++程序中打印当前函数调用栈
- Linux调用backtrack函数打印程序崩溃时的调用堆栈
- 在C/C++程序里打印调用栈信息
- 华为手机调试Android程序崩溃不打印Log
- 在C/C++程序中打印当前函数调用栈
- 在C/C++程序中打印当前函数调用栈
- 在C/C++程序里打印调用栈信息
- 在C/C++程序里打印调用栈信息