1. 程式人生 > >探索 DWARF 除錯格式資訊

探索 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、dwarfdumplibdwarf,它們可用於讀取 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

/usr/vacpp/bin/xlC -g -qdbgfmt=dwarf -o test test.C

圖 1. 樣例測試程式

樣例測試程式

上面示例中的 dwarfdump 輸出可以使用以下方式進行解釋。

編譯單元

DW_TAG_compile_unit.debug_abbrev 部分如圖 2 所示。

圖 2. .debug_abbrev 部分

.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

.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

typedef

從圖 8 中,我們可以瞭解到,有一個 typedef 條目,名稱為 int_type,其型別在位置 <82> 上,型別為 int

提取列舉資訊

  • DW_TAG_enumeration_type 包括列舉 名稱,DW_TAG_enumerator 表示其元素的資訊。
  • DW_AT_const_value 指定了分配給元素的值。

圖 9. 列舉值

列舉值

圖 9 說明:

  • myenumenum 的名稱,其大小為 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 系統時有一個更好的認識。