如何在我的C++程序中访问`addr2line`功能?

24

我需要从C++程序内获取由addr2line提供的信息(函数调用的回溯源文件和行号)。

我知道可以直接调用addr2line作为子进程,并且可以将addr2line的源代码复制到我的程序中(该程序也是GPL许可)。但这段代码看起来很复杂,直接使用不太舒服。anyway,bfd的意思是什么?我更愿意使用C++ STL库中的一些函数,因为那样更简洁。

我在Linux环境下工作。


libdwarf 是你正在寻找的。 - Johannes Schaub - litb
谢谢您的建议。我尝试了dwarfdump,但它只打印函数声明的位置,而不是调用它们的位置。不过我找不到一个好的文档... - steffen
2
bfd 是 http://en.wikipedia.org/wiki/Binary_File_Descriptor_library 的缩写(尽管最初它代表 BFD 的另一种含义 :))。 - ecatmur
1
你可以使用 ltrace 查看 addr2line 的调用,但你可能不想直接链接到 bfd:http://lists.debian.org/debian-devel/2005/05/msg01086.html - Flexo
糟糕!我唯一的方法就是调用popen("addr2line",“r”)并解析输出! - steffen
1
这里有一个可用的实现。https://github.com/albfan/bindutils-gdb/issues/1。现在是一个系统调用,但它的目标是创建一个addr2line库。看起来相当简单! - albfan
2个回答

7
您可以尝试使用dladdr()函数。它使用程序的动态符号,而不是调试信息(使用gcc -rdynamic编译程序)。

此外,您可以检查backtrace库或更高级别的stacktrace库。
虽然不完全符合您的要求,但它们可能会有所帮助。


1
谢谢您的建议。使用dladdr()我只能获取动态链接代码的信息,而且如果我正确理解手册的话,只能获取文件名,无法获取行号。我已经在使用backtrace获取地址了。现在我需要的是从地址中获取文件和行信息的东西。stacktrace只是backtrace的包装器。 - steffen
1
除此之外,还有libunwind库:http://www.nongnu.org/libunwind/ - Arto Bendiken
@ArtoBendiken libunwind没有类似addr2line的功能。它只提供偏移量。 - tjysdsg

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接