2011-03-01 133 views
1

我正在使用GCC ARM交叉編譯器(arm-none-eabi-*)並使用專有調試器。調試器可以突出顯示選定源代碼行的結果彙編。使用nm和objdump,我可以看到該二進制文件有多個.debug_*部分。很顯然,調試器使用這些部分中包含的信息將源代碼行映射到反彙編(反之亦然)。但我想如何。我想知道這些部分包含哪些信息,它們是如何相關的以及如何理解它們。簡而言之,如果我要編寫一個調試器(或者至少可以顯示這些映射的工具:源代碼拆卸,以及每個源代碼行反彙編代碼的數量),我將如何閱讀這些部分並使用它們, 。假設零編譯優化。GCC調試信息

想必有一些文檔描述這些部分的格式?

+0

[DWARF](http://en.wikipedia.org/wiki/DWARF)? – Offirmo 2012-01-02 16:29:44

回答

0

.debug_ *部分包含DWARF調試標準描述的格式的數據。該標準有一個網站,你可以下載標準規格:http://www.dwarfstd.org/

有可用於解析存儲格式(這是高度濃縮,以節省空間)庫,一個這樣的libdwarf可在這裏:http://reality.sgiweb.org/davea/dwarf.html

簡而言之,不同部分包含源程序的不同方面,以及它們如何映射到目標機器體系結構(代碼和數據地址)。在編譯過程中通常會丟失的信息由調試信息條目樹來表示,這些條目是具有標識標籤的結構以及各種屬性。例如,變量聲明的DIE由具有DW_TAG_variable標記的DIE表示,並且可以具有諸如以下屬性:名稱,聲明它的文件/行/列,目標文件中的內存位置等。

.debug_info和.debug_abbrev部分一起表示調試信息條目樹。 .debug_line部分包含的信息允許調試器重建一個完整的表映射源代碼行到目標代碼地址(並且包含其他信息,例如源代碼行是否是語句的開始,並且是開始的基本塊等)。

其他部分包含調用框架信息和用於快速查找變量DIE和名稱類型的加速查找表等等。這一切都在標準中描述。