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);
}
程序崩溃时打印调用栈
最新推荐文章于 2024-02-26 22:59:03 发布
这篇博客介绍了如何在程序崩溃时通过makefile生成调用栈信息,以帮助开发者定位问题。示例中展示了从main函数逐层调用到func3、func2和func1的过程,以及调用栈的具体内容,包括信号处理函数segv_handler和相关库函数的地址。
摘要由CSDN通过智能技术生成