簡體   English   中英

遠程進程的源代碼名稱和行號

[英]source code name and line number of the remote process

您好我正在嘗試創建某種調試器來查看系統調用以檢測它們,但從可用性的角度來看,我希望能夠獲取檢測到錯誤的源代碼名稱和行號。 我一直在使用名為 libunwind 的庫,但它給了我 function 名稱,與 function 的偏移量,以及可執行文件地址空間中的程序計數器。 但是,如果您查看 valgrind 或 gdb,它會在使用 -g 標志編譯時為您提供行號和源代碼名稱。 我該怎么做?

不幸的是,libunwind 只擅長從調用堆棧中獲取地址。 您要查找的庫是Ian Lance Taylor 的 libbacktrace

它解析 DWARF 調試信息。 因此,它能夠生成帶有內聯函數名稱、源文件名和行號的回溯。

編輯:另一個選項是back-cpp 不過,我沒有這方面的經驗,但我可以證明 libbacktrace 非常棒!

對於交互式查看,您可以使用addr2line命令行實用程序。 它采用可執行名稱和地址(程序計數器),並輸出源文件和行。 如果您創建了一個程序化解析器,您可以使用它來檢查自己。

為了將地址解析為程序中的一行,您必須解析可執行文件中的 DWARF 信息,特別是行號部分。 粗略地看一下libunwind API,它似乎不支持檢索那種信息。 還有一個名為libdwarf的庫,它支持通用 DWARF 解析。 不過,這將是一個相當復雜的項目,行號存儲在 DWARF 中的方式並不簡單。

如果您不想 go 一直使用libdwarf ,您可以使用readelf --debug-dump=decodedline命令行將行號部分轉換為(相對)易於解析的文本文件,並解析/解釋從您的 C 程序。 它將為您提供程序計數器值(范圍)和源代碼行號之間的對應關系。

從命令行轉儲行信息的另一種方法是dwarfdump -l 那是更底層的IIRC。

請記住內聯函數。 相同的 PC 值可能對應多個源行。

要以交互方式查看可執行文件中的 DWARF 信息,您可以使用DWARF Explorer GUI 工具(完全公開:我編寫了 GUI)。 行號將位於源文件的頂部項下,在stmt_list下。 該工具背后的 DWARF 解析器是 Python 一個,而不是 C 一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM