加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何修复C中的回溯行号错误

发布时间:2020-12-16 10:30:28 所属栏目:百科 来源:网络整理
导读:我想在跟踪程序捕获异常的一些信息时遇到问题. 我使用了以下功能: extern "C" void log_backtrace(){ // Dump the callstack int callstack[128]; int frames = backtrace((void**) callstack,128); char** strs = backtrace_symbols((void**) callstack,fr
我想在跟踪程序捕获异常的一些信息时遇到问题.

我使用了以下功能:

extern "C" void log_backtrace()
{   
    // Dump the callstack
    int callstack[128];
    int  frames = backtrace((void**) callstack,128);
    char** strs = backtrace_symbols((void**) callstack,frames);

    for (int i = 1; i < frames; ++i)
    {
        char functionSymbol[64*1024];
        char moduleName    [64*1024];
        int  offset        = 0;
        sscanf(strs[i],"%*d %s %*s %s %*s %d",&moduleName,&functionSymbol,&offset);
        int addr = callstack[i];
        int   validCppName;
        char* functionName = abi::__cxa_demangle(functionSymbol,NULL,&validCppName);
        if (validCppName == 0)
            printf(   "t%8.8x — %s + %dtt(%s)n",addr,functionName,offset,moduleName);
        else
            printf(   "t%8.8x — %s + %dtt(%s)n",functionSymbol,moduleName);
        if (functionName)
            free(functionName);
    }
    free(strs);
}

输出是这样的:

20:48:44 [ERROR]tcp_client::connect() failed. error:Connection refused
00000001 — latte::Log::out_error(std::string const&) + 151      (valhalla)
001a6637 — latte::tcp_client::connect(boost::asio::ip::basic_endpoint<boost::asio::ip::tcp> const&) + 307       (valhalla)
00000001 — valhalla::hall::start() + 388        (valhalla)
00204803 — main + 388       (valhalla)
00000001 — start + 52       (valhalla)
00143ae4 — 0x0 + 1      (???)

所有信息(名称空间,类名和方法名称)都很好.但唯一的问题是行号是错误的.

如何修复回溯中的行号?

解决方法

它们不是行号,而是函数开头的偏移量.有一个名为addr2line的工具,它带有binutils,可以在给定调试符号的情况下将地址转换为行号.你可以在程序中调用它(pipe()fork()exec()),或者查看它用来执行此操作的库.

在我的Linux系统上,addr2line在内部使用libbfd.从我所看到的情况来看,它并没有很好的记录,但是从addr2line源代码中可以很容易地看到它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读