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获取堆栈信息并且打印,通过这种方法获取段错误发生时的堆栈信息。

浙公网安备 33010602011771号