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 文件?