C++ 段错误调试(打印报错时的函数堆栈)
C++程序发生段错误时,由于没有很多有效信息,非常难排查。
为了定位发生段错误时的位置,有一种分发可以打印报错时的函数堆栈情况。这样就可以定位到段错误发生时,代码跑到了哪一行。
当然,这种办法也只能辅助判断错误原因,毕竟段错误出现时通常代表取到无效地址等等严重错误,发生错误的原因不一定在报错时的那一行。
主要使用这俩函数:
pcount = backtrace(buf,count);
stack = backtrace_symbols(buf,pcount);
代码如下:
void handler(int s);
void print_function(int count);
void handler(int s)
{
printf("now got a segmentation violation signal \n");
print_function(10);//0是当前函数,1是上一个函数
exit(EXIT_FAILURE);
}
void print_function(int count)
{
count = count + 2;
int pcount;
void *buf[count];
char **stack;
pcount = backtrace(buf,count);
stack = backtrace_symbols(buf,pcount);
if (nullptr == stack){
perror("backtrace_symbols has not get stacks.");
exit(EXIT_FAILURE);
}
//原本指定打印第n个函数,现在全部打印,可以看的更多堆栈信息
for (int i = 0; i <pcount; ++i) {
printf("[%02d] %s\n",i,stack[i]);
addLog("signal --> Error:" + string(stack[i]), __FILE__,__FUNCTION__, __LINE__);
}
// printf("[%02d] %s\n",pcount,stack[pcount -1]);
//addLog("signal --> Error:" + string(stack[pcount -1]), __FILE__,__FUNCTION__, __LINE__);
free(stack);
}
//把这行放到主进程中,一般放到main函数中即可。
signal(SIGSEGV,handler);
上面代码通过捕获SIGSEGV信号,在触发SIGSEGV信号时执行handler,hander中通过print_function获取堆栈信息并且打印,通过这种方法获取段错误发生时的堆栈信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具