c++:以编程方式将符号转换为代码行号

Posted

技术标签:

【中文标题】c++:以编程方式将符号转换为代码行号【英文标题】:c++ : convert symbols to code line numbers programmatically 【发布时间】:2013-05-28 12:50:41 【问题描述】:

我在Linux/gcc下开发

我目前使用以下方法来获取自定义抛出异常的堆栈跟踪。 Demangled 函数名称和 line numbers 符合预期,但我想避免使用 addr2line 来完全控制输出字符串的格式。

static void posix_print_stack_trace()

    int i, trace_size = 0;
    char **messages = (char **)NULL;

    trace_size = backtrace(stack_traces, MAX_STACK_FRAMES);
    messages = backtrace_symbols(stack_traces, trace_size);

    for (i = 0; i < trace_size; ++i)
    
        if (addr2line(program_invocation_name, stack_traces[i]) != 0)
        
            printf("  error determining line # for: %s\n", messages[i]);
        
    
    if (messages)  free(messages); 


static int addr2line(char const * const program_name, void const * const addr)

    char addr2line_cmd[512] = 0; 
    sprintf(addr2line_cmd,"addr2line -C -f -p -i -e %.256s %p", program_name, addr);
    return system(addr2line_cmd);

注意:使用-f 在堆栈跟踪中显示正在运行的函数名称,使用-C 显示它们已解构。

问:有没有人可以给我指出一个程序化的解决方案? (如果可能的话,请给我一些建议,告诉我如何让它与MinGW/gcc 一起工作。

注意:或者可能只是以某种方式使用 gdb 可以帮助获得更多自定义输出?

感谢您的帮助。

编辑:看起来像windows部分,这样可行:https://***.com/a/6207030/1715716

编辑 :以上指向 Microsoft Visual only 解决方案,所以对我来说最终没用。

【问题讨论】:

我还尝试自定义addr2line,它是一个文件,但依赖于我没有的依赖项:libelftc... 【参考方案1】:

您可能可以使用或改编(至少在 Linux 和使用 ELF 和 DWARF 的系统上)由 Ian Taylor 编写的 libbacktrace,它目前位于 GCC 源代码树中。见here;原则上,它应该可以独立于 GCC 使用(前提是您遵守其类似 BSD 的许可证)。

【讨论】:

我对许可证没有任何问题,因为我自己的程序也将在类似 BSD 的程序下共享。感谢您的指点。我会进去的。 正如你所说,我能够独立于 gcc 构建libbacktrace(请注意,此功能只是早期 gcc 4.8 的一部分)。我还没有测试过使用 MinGW 构建它。希望这是可行的,因为在我的问题的编辑部分给出的指针是仅视觉的东西(第一次没有看到)......

以上是关于c++:以编程方式将符号转换为代码行号的主要内容,如果未能解决你的问题,请参考以下文章

Selenium - 以编程方式将 html 转换为 junit

如何以优雅有效的方式将无符号/有符号整数/长整数转换为 C 字符串?

如何在android中以编程方式将音频.mp3转换为.m4a

如何以编程方式将 mp3 转换为 iTunes 可播放的 aac/m4a 文件?

您如何以编程方式将 Flex TextArea 的插入符号移到末尾?

以编程方式将 fbx 转换为 scn