探索 DWARF 除錯格式資訊
https://www.ibm.com/developerworks/cn/aix/library/au-dwarf-debug-format/index.html
簡介
DWARF(使用有屬性的記錄格式進行除錯 )是許多編譯程式和除錯程式所使用的一種除錯檔案格式,可以支援原始碼級的除錯。它是物件檔案內的除錯資訊的格式。程式的 DWARF 描述是一個樹形結構,每個節點都可以有子節點或兄弟節點。節點可能代表型別、變數或函式。
DWARF 使用一系列的除錯資訊條目(DIE)來定義源程式的一個低階表示。每個除錯資訊條目由一個識別標記和一系列屬性組成。條目或條目組提供了在源程式中的相應實體的描述。標記指定了條目所屬的類,而屬性定義了條目的具體特點。
DWARF 部分
組成 DWARF 資料的不同 DWARF 部分如下:
資料列 | 資訊說明 |
---|---|
.debug_loc |
在 DW_AT_location 屬性中使用的位置列表 |
.debug_macinfo |
巨集資訊 |
.debug_pubnames |
全域性物件和函式的查詢表 |
.debug_pubtypes |
全球型別的查詢表 |
.debug_ranges |
在 DW_AT_ranges |
.debug_str |
在 .debug_info 中使用的字串表 |
.debug_types |
型別描述 |
.debug_abbrev
部分包含 DWARF 編譯的所編譯單元的縮寫表。單個編譯單元的縮寫表包含一系列的縮寫宣告。每個宣告都為一個特定的除錯資訊條目指定了標記和屬性。縮寫表中的相應條目會幫助您找到直接包含在 .debug_info
部分中的資訊的解釋。.
debug_info
部分包含符號的原始資訊。每個編譯單元都與一個特定的縮寫表關聯,但多個編譯單元可以共享同一個表。
DWARF 表示
有一些獲得了許可的工具,比如 readelf、dwarfdump 和 libdwarf,它們可用於讀取 DWARF 資訊。指令碼或程式可以讀取這些工具的輸出,以查詢和解釋所需的資訊。重要的是知道編寫此類指令碼的標記和屬性定義。
常用的標記和屬性
下面的列表顯示了在除錯 C++ 應用程式時最受關注的標記。
資料列 | 資訊說明 |
---|---|
DW_TAG_class_type |
表示類名稱和型別資訊 |
DW_TAG_structure_type |
表示結構名稱和型別資訊 |
DW_TAG_union_type |
表示聯合名稱和型別資訊 |
DW_TAG_enumeration_type |
表示聯合名稱和型別資訊 |
DW_TAG_typedef |
表示 typedef 名稱和型別資訊 |
DW_TAG_array_type |
表示陣列名稱和型別資訊 |
DW_TAG_subrange_type |
表示陣列大小資訊 |
DW_TAG_inheritance |
表示繼承的類名稱和型別資訊 |
DW_TAG_member |
表示類的成員 |
DW_TAG_subprogram |
表示函式名稱資訊 |
DW_TAG_formal_parameter |
表示函式引數的資訊 |
DW_AT_name |
表示名稱字串 |
DW_AT_type |
表示型別資訊 |
DW_AT_artificial |
在建立時由編譯程式設定 |
DW_AT_sibling |
表示兄弟位置資訊 |
DW_AT_data_member_location |
表示位置資訊 |
DW_AT_virtuality |
在虛擬時設定 |
DWARF 資訊
通過下面的命令,使用 XLC 編譯程式以 DWARF 格式編譯一個程式。
1 |
|
圖 1. 樣例測試程式
上面示例中的 dwarfdump
輸出可以使用以下方式進行解釋。
編譯單元
DW_TAG_compile_unit
的 .debug_abbrev
部分如圖 2 所示。
圖 2. .debug_abbrev 部分
DW_TAG_*
後面通常是 DW_CHILDREN_*
和一系列屬性 (DW_AT_*
) 與 (DW_FORM_*
) 格式。DW_CHILDREN_*
是一個單位元組的值,用於確定使用此縮寫的除錯資訊條目是否有子條目。如果該值是 DW_CHILDREN_yes
,那麼使用此縮寫的任何除錯資訊條目的下一個物理繼承條目應該是該條目的第一個子條目。如果後跟縮寫詞的標籤編碼的單位元組的值是 DW_CHILDREN_no
,那麼使用此縮寫的任何除錯資訊條目的下一個物理繼承條目應該是該條目的第一個兄弟條目。每個兄弟條目鏈都用一個空條目來終止。
圖 3. .debug_info 部分中的 DW_TAG_compile_unit
DW_FORM_*
屬性指定了讀取 .debug_info
部分中的 DW_AT*
的方式。在本例中,DW_AT_name
是字串形式的。所以 DW_TAG_compile_unit
的第一個屬性必須是作為 .debug_info
部分中的一個字串(即 test.C)進行處理的。
- 檔案型別是
C_plus_plus
,它位於/home/raji。
- 檔案是使用
IBM XL C/C++
v12 編譯的。
提取類資訊
DW_TAG_class_type
– 表示類名稱和型別資訊DW_TAG_member
– 表示類的成員
圖 4. 類名稱和成員資訊
圖 4 說明:
- 有一個數據型別,名為
int
,大小為4
個位元組。 - 有一個類,名為
base
,大小為4
個位元組,其兄弟條目的位置是<126>
。 - 有一個類成員,名稱為
basemember
。此成員的型別的位置是<82>
,即int
。範圍是public
,它位於從類的起點開始的第 0 個位置。
提取陣列大小
DW_TAG_array_type
的直接子條目是 DW_TAG_subrange_type
,它包含陣列大小。陣列大小的計算方法是 (DW_AT_upper_bound
- DW_AT_lower_bound
) +1。如果該陣列是一個二維陣列,則會再次出現型別為 DW_TAG_subrange_type
的直接兄弟條目。在本例中,陣列的大小是 8(7+1)。
圖 5. 陣列大小
提取函式名稱和引數
DW_TAG_subprogram -
表示函式名稱資訊DW_TAG_formal_parameter
-
表示函式引數的資訊
圖 6. 函式名稱
圖 7. 函式引數
圖 7 說明:
- 有一個函式,名為
display
,範圍是public
,其兄弟條目位於<332>
。 - 處理過後的名稱(mangled name)是
display__7myclassFi
。 - 函式的第一個引數是
這種
。它被編譯程式建立為DW_AT_artificial
,並被設定為yes
,其型別位於<421>
,型別為myclass
。 - 第二個引數的名稱是 x,型別在位置
<82>
上,型別為int
。
提取 typedef
DW_TAG_typedef
表示 typedef 名稱和型別資訊。
圖 8. typedef
從圖 8 中,我們可以瞭解到,有一個 typedef
條目,名稱為 int_type
,其型別在位置 <82>
上,型別為 int
。
提取列舉資訊
DW_TAG_enumeration_type
包括列舉 名稱,DW_TAG_enumerato
r 表示其元素的資訊。DW_AT_const_value
指定了分配給元素的值。
圖 9. 列舉值
圖 9 說明:
myenum
是 enum 的名稱,其大小為4
個位元組。Jan
是第一個元素,其值是1
。Feb
是第二個元素,其值是2
。
提取繼承資訊
DW_TAG_inheritance
表示繼承的類名稱和型別資訊。
圖 10. 繼承
圖 10 說明:
- 有一個派生的類,名稱為
myclass
,大小為24
個位元組。 - 基類在位置
94.
上,其名稱為base
。 DW_VIRTUALITY_none
屬性指定它是一個非虛擬類。
相關主題
- 閱讀有關 DWARF 除錯標準的更多資訊。
- DWARF 除錯格式簡介。
- AIX and UNIX 專區:developerWorks 的“AIX and UNIX 專區”提供了大量與 AIX 系統管理的所有方面相關的資訊,您可以利用它們來擴充套件自己的 UNIX 技能。
- AIX and UNIX 專題彙總:AIX and UNIX 專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,為了方便您的訪問,我們在這裡為您把本專區的所有專題進行彙總,讓您更方便的找到您需要的內容。
- AIX and UNIX 下載中心:在這裡你可以下載到可以執行在 AIX 或者是 UNIX 系統上的 IBM 伺服器軟體以及工具,讓您可以提前免費試用他們的強大功能。
- IBM Systems Magazine for AIX 中文版:本雜誌的內容更加關注於趨勢和企業級架構應用方面的內容,同時對於新興的技術、產品、應用方式等也有很深入的探討。IBM Systems Magazine 的內容都是由十分資深的業內人士撰寫的,包括 IBM 的合作伙伴、IBM 的主機工程師以及高階管理人員。所以,從這些內容中,您可以瞭解到更高層次的應用理念,讓您在選擇和應用 IBM 系統時有一個更好的認識。