打印release版本coredump时的栈信息的一种方式

本文介绍的这种方式通过c语言中的execinfo.h头文件的两个函数,backtrace和backtrace_symbols_fd来完成该任务。该方式只是生成一个error文件,该error文件中包含的就是栈信息。

首先要加上信号异常时的handler进行捕捉,如下

            signal(SIGSEGV, SignalHandler);

也就是发生段错误时,会调用SignalHandler这个函数,这个函数可以这么写

    void *array[50];
    time_t cur_time;
    struct tm *tblock;
    char buf[50];
    cur_time = time(NULL);
    sprintf(buf, "%lld", cur_time);
    string error_log = string("error.log") + buf;
    size_t size;
    int fd = open(error_log.c_str(), O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
    sprintf(buf, "In signal handler function, the signal is %d\n", sig);
    write(fd, buf, strlen(buf));
    size = backtrace(array, 50);
    backtrace_symbols_fd(array, size, fd);

    close(fd);
    signal(sig, SIG_DFL);

对error文件加上了timestamp以做区分。我们看一下某一个error文件的内容如下

  1 ./Searcher[0x49b276]

  2 /lib64/libc.so.6[0x3d69c302d0]

  3 ./Searcher[0x412458]

  4 ./Searcher[0x425229]

  5 ./Searcher[0x4261f0]

  6 ./Searcher[0x42dfe4]

  7 ./Searcher[0x49d805]

  8/lib64/libpthread.so.0[0x3d6a806617]

  9/lib64/libc.so.6(clone+0x6d)[0x3d69cd3c2d]

用addr2line命令来分析(-e 后面是执行文件, -f表示打印函数信息),如:

[zhangle@localhost env]$ addr2line 0x49b276-e Searcher -f

_ZN7CDaemon13SignalHandlerEi

??:0

[zhangle@localhost env]$ addr2line 0x412458-e Searcher -f

_ZN9CSearcher18SearchAllTextFieldERSt6vectorIP10CTextQuerySaIS2_EERS0_I7SResultSaIS6_EER7CBitMapbim

??:0

[zhangle@localhost env]$ addr2line 0x425229-e Searcher -f

_ZN9CSearcher8MatchDocERSt6vectorIP10CTextQuerySaIS2_EERS0_IP6CQuerySaIS7_EERS0_I7SResultSaISB_EEiP7CModule

??:0

[zhangle@localhost env]$ addr2line 0x4261f0-e Searcher -f

_ZN9CSearcher6SearchERN9__gnu_cxx8hash_mapISsSsNS0_4hashISsEESt8equal_toISsESaISsEEERSsR11ConnectInfo

??:0

[zhangle@localhost env]$ addr2line 0x42dfe4-e Searcher -f

_ZN9CSearcher13HandleRequestERSsS0_R11ConnectInfo

??:0

[zhangle@localhost env]$ addr2line 0x49d805-e Searcher -f

_ZN12CServerFrame12ServerThreadEPv:w

 

   标红的就是函数信息。这样我们知道是CSearcher::SearchAllTextField函数除了问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值