linux c/c++ 程序崩溃时打印调用栈

33 篇文章 1 订阅
17 篇文章 0 订阅

本文章是在总结前人的帖子后实现的,经过验证是可以使用的。

但是在个别信号下,还是不能详细的打印有效信息。


void dump(void)
{
        char szLog[MAX_LOG_LEN] = {0};
        int j, nptrs;
        const int BACKTRACE_SIZE = 16; 
        void *buffer[BACKTRACE_SIZE];
        char **strings;


        nptrs = backtrace(buffer, BACKTRACE_SIZE);


        snprintf(szLog, MAX_LOG_LEN, "backtrace() returned %d addresses", nptrs);
        CLogError(szLog);
        strings = backtrace_symbols(buffer, nptrs);
        if (strings == NULL) {
                perror("backtrace_symbols");
                exit(EXIT_FAILURE);
        }   


        for (j = 0; j < nptrs; j++) 
        {   
                snprintf(szLog, MAX_LOG_LEN, "  [%02d] %s", j, strings[j]);
                CLogError(szLog);
        }   
                                                                                                                                                                                                                                                             


        free(strings);
        char buff[128] = { 0x00 };
        snprintf(buff, 128, "cat /proc/%d/maps", getpid());
        CLogError(buff);
        system((const char*)buff);
}


void signal_handler(int signo)
{
        char szLog[MAX_LOG_LEN] = {0};
        snprintf(szLog, MAX_LOG_LEN, "\n=========>>>catch signal %d <<<=========\n", signo);
        CLogError(szLog);


        CLogError("Dump stack start...\n");
        dump();
        CLogError("Dump stack end...\n");


        signal(signo, SIG_DFL);
        raise(signo);

}

在主函数终注册信号回调函数

        signal(SIGSEGV, signal_handler);

        signal(SIGABRT, signal_handler);



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值