This Halloween Pikachu follows your mouse or screen taps

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

posted @   图图雷  阅读(252)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示