2012-07-19 51 views
13

我需要從C++程序中獲取addr2line(從追溯函數調用的文件和行)提供的信息。是否有類似於addr2line的庫調用?是否有對addr2line的庫調用?

編輯:我正在Linux環境中工作。

我知道我可以直接調用addr2line,我知道我可以在我的程序中使用addr2line的source code(這也是GPL許可的)。但我想調用一個庫函數,如果它存在的話,更清潔。

編輯:我將使用binutils的bfd,就像addr2line一樣。無論如何,bfd意味着什麼?

+0

libdwarf是你正在尋找的 – 2012-07-19 08:23:42

+0

謝謝你的建議。我試過了dwarfdump,它只打印聲明函數的位置,而不是它們被調用的地方。雖然我找不到像樣的文檔,但是... – steffen 2012-07-19 09:46:56

+2

'bfd'是http://en.wikipedia.org/wiki/Binary_File_Descriptor_library(儘管它本來代表BFD的其他含義:) – ecatmur 2012-07-20 12:09:16

回答

6

您可以嘗試功能dladdr()。它使用程序的動態符號,而不是調試信息(使用gcc -rdynamic編譯程序)。

此外,您可以檢查backtrace庫,或更高級別stacktrace庫。
不完全是你在問什麼,但他們可能會證明是有用的。

+1

謝謝你的提示。使用'dladdr()',我只能獲得關於動態鏈接代碼的信息,只有文件名,而不是行,如果我理解了manpage的話。我已經在使用回溯來獲取地址。我現在需要的是獲取文件和線路的地址。堆棧跟蹤僅僅是回溯的包裝。 – steffen 2012-07-19 09:10:20

+0

除此之外,還有'libunwind'庫:http://www.nongnu.org/libunwind/ – 2015-07-03 22:24:39