• 利用Backtrace来捕获段错误堆栈信息


    具体参考文档:https://blog.csdn.net/gatieme/article/details/84189280

    测试Demo:

    #include <execinfo.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <stddef.h>
    
    void print_trace(void)
    {
        void* array[30];
        size_t size;
        char** strings;
        size_t i;
    
    
        size = backtrace(array, 30);
        strings = backtrace_symbols(array, size);
        if (NULL == strings)
        {
            perror("backtrace_symbols");
            exit(EXIT_FAILURE);
        }
    
        printf("Obtained %zd stack frames.
    ", size);
    
        for(i = 0 ; i < size; i++)
        {
            printf("%s
    ", strings[i]);
        }
    
        free(strings);
        strings = NULL;
    
        exit(EXIT_SUCCESS);
    }
    
    void sighandler_dump_stack(int sig)
    {
        psignal(sig, "handler");	// 打印信号相关信息
        print_trace();
        signal(sig, SIG_DFL);		// 恢复信号默认处理
        raise(sig);					// 继续后续的流程
    }
    
    void dumy_function(void)
    {
        print_trace();
    }
    
    void func_c()
    {
        *((volatile int*)0x00) = 0x100;
    }
    
    void func_b()
    {
        func_c();
    }
    
    void func_a()
    {
      func_b();
    }
    
    int main(int argc, char* argv[])
    { 
        if (signal(SIGSEGV, sighandler_dump_stack) == SIG_ERR)
    		perror("signal failed");		// 在标准错误输出上打印格式: 自定义信息(调用函数名+failed): errno的具体描述
    
        func_a();
        return 0;
    }
    
    

    使用注意事项:
    编译时,需要加上

    • -g : 增加调试信息
    • -rdynamic : 增加符号名称支持

    得到段错误时,如何定位错误

    在查看堆栈前,进入捕获 SIGSEGV 信号自定义函数前的地址addr,再根据

    查看异常函数位置:

    • add32line -C -f -e ./exe_name addr
      输出如下:

    查看发生异常的函数源码信息

    • objdump -DS ./handler | grep -6 "400c74"
      输出如下:
  • 相关阅读:
    C++ Builder string相互转换(转)
    Delphi中ComPort通信中的数据处理(转)
    GPRS管理与创建APN拨号连接(转)
    Delphi MaskEdit用法(转)
    GPRS DTU概念及DTU的工作原理(转)
    TIdTCPClient 详解
    GPRS的工作原理、主要特点
    Android studio快捷键
    HDU 1255 覆盖的面积(线段树+扫描线)
    Rescue
  • 原文地址:https://www.cnblogs.com/cherishui/p/10341048.html
Copyright © 2020-2023  润新知