llvm-pdbutil - PDB 檔案鑑識與診斷

語法

llvm-pdbutil [子命令] [選項]

說明

顯示 PDB 檔案中的類型、符號、CodeView 記錄和其他資訊,以及操作和建立 PDB 檔案。 llvm-pdbutil 通常由基於 FileCheck 的測試使用,用於測試 LLVM 的 PDB 讀取和寫入功能,但也可以用於一般的 PDB 檔案調查和鑑識,或作為 cvdump 的替代品。

子命令

llvm-pdbutil 分為幾個子命令,每個子命令都針對不同的目的量身打造。以下是每個命令的簡要摘要,後續章節將提供更多詳細資訊。

  • pretty - 以盡可能接近原始程式碼的格式傾印符號和類型資訊。

  • dump - 從 PDB 檔案傾印低階類型和結構,包括 CodeView 記錄、雜湊表、PDB 資料流等。

  • bytes - 將 PDB 檔案的資料流、記錄、類型、符號等的資料以原始位元組傾印。

  • yaml2pdb - 給定 PDB 檔案的 yaml 描述,產生符合該描述的有效 PDB 檔案。

  • pdb2yaml - 針對給定的 PDB 檔案,以可以重建 PDB 的方式產生部分或全部檔案的 YAML 描述。

  • merge - 給定兩個 PDB,產生第三個 PDB,它是合併兩個輸入 PDB 的結果。

pretty

重要

pretty 子命令建立在 Windows DIA SDK 之上,因此在非 Windows 平台上不受支援。

用法:llvm-pdbutil pretty [選項] <輸入 PDB 檔案>

摘要

pretty 子命令以非常高的層級顯示程式的偵錯資訊表示。由於它建立在 Windows DIA SDK 之上,而 Windows DIA SDK 是 Windows 工具和偵錯器查詢偵錯資訊的標準 API,因此與顯示低階 CodeView 記錄的模式相比,它呈現了偵錯器如何解譯偵錯資訊的更具權威性的視圖。

選項

篩選和排序選項

注意

排除 篩選器的優先順序高於 包含 篩選器。因此,如果篩選器同時符合包含和排除規則,則會將其排除。

-exclude-compilands=<string>

傾印編譯單元、編譯單元原始程式檔貢獻或每個編譯單元符號時,此選項指示 llvm-pdbutil 省略任何符合指定正規表示式的編譯單元。

-exclude-symbols=<string>

傾印全域、公開或每個編譯單元符號時,此選項指示 llvm-pdbutil 省略任何符合指定正規表示式的符號。

-exclude-types=<string>

傾印類型時,此選項指示 llvm-pdbutil 省略任何符合指定正規表示式的類型。

-include-compilands=<string>

傾印編譯單元、編譯單元原始程式檔貢獻或每個編譯單元符號時,將初始搜尋限制為僅限符合指定正規表示式的編譯單元。

-include-symbols=<string>

傾印全域、公開或每個編譯單元符號時,將初始搜尋限制為僅限符合指定正規表示式的符號。

-include-types=<string>

傾印類型時,將初始搜尋限制為僅限符合指定正規表示式的類型。

-min-class-padding=<uint>

僅顯示至少具有指定數量對齊填補的類型,並考慮基類和聚合欄位成員中的填補。

-min-class-padding-imm=<uint>

僅顯示至少具有指定數量對齊填補的類型,而忽略基類和聚合欄位成員中的填補。

-min-type-size=<uint>

僅顯示 sizeof(T) 大於或等於指定數量的類型 T。

-no-compiler-generated

不要顯示編譯器產生的類型和符號

-no-enum-definitions

傾印列舉時,不顯示完整的列舉(例如,個別的列舉值)。

-no-system-libs

不顯示系統程式庫中的符號

符號類型選項
-all

表示此類別中的所有其他選項。

-class-definitions=<format>

以指定的格式顯示類別定義。

=all      - Display all class members including data, constants, typedefs, functions, etc (default)
=layout   - Only display members that contribute to class size.
=none     - Don't display class definitions (e.g. only display the name and base list)
-class-order

以指定的順序顯示類別。

=none            - Undefined / no particular sort order (default)
=name            - Sort classes by name
=size            - Sort classes by size
=padding         - Sort classes by amount of padding
=padding-pct     - Sort classes by percentage of space consumed by padding
=padding-imm     - Sort classes by amount of immediate padding
=padding-pct-imm - Sort classes by percentage of space consumed by immediate padding
-class-recurse-depth=<uint>

傾印類別定義時,在遞迴指定的次數後停止。預設值為 0,表示沒有限制。

-classes

顯示類別

-compilands

顯示編譯單元(例如,物件檔案)

-enums

顯示列舉

-externals

傾印外部(例如,匯出的)符號

-globals

傾印全域符號

-lines

傾印原始程式碼行與程式碼位址之間的對應。

-module-syms

顯示每個編譯單元的符號(變數、函數等)

-sym-types=<types>

指定 -globals、-externals 或 -module-syms 時要傾印的符號類型。(預設為全部)

=thunks - Display thunk symbols
=data   - Display data symbols
=funcs  - Display function symbols
=all    - Display all symbols (default)
-symbol-order=<order>

針對透過 -module-syms、-globals 或 -externals 選項傾印的符號,以指定的順序排序結果。

=none - Undefined / no particular sort order
=name - Sort symbols by name
=size - Sort symbols by size
-typedefs

顯示 typedef 類型

-types

顯示所有類型(表示 -classes、-enums、-typedefs)

其他選項
-color-output

強制開啟或關閉彩色輸出。預設情況下,如果輸出到終端機,則使用彩色。

-load-address=<uint>

顯示相對虛擬位址時,假設進程載入在給定的位址,並顯示絕對位址。

dump

用法:llvm-pdbutil dump [選項] <輸入 PDB 檔案>

摘要

dump 子命令顯示有關 PDB 檔案結構的低階資訊。LLVM 的測試基礎架構大量使用它,但它也可以用於 PDB 鑑識。它的作用類似於 Microsoft 的 cvdump 工具。

注意

dump 子命令公開檔案格式的內部細節。因此,讀者在使用此命令之前,應熟悉 PDB 檔案格式

選項

MSF 容器選項
-streams

傾印 PDB 檔案中所有串流的摘要。

-stream-blocks

-streams 結合使用時,將有關指定串流佔用哪些區塊的資訊添加到輸出中。

-summary

傾印 MSF 和 PDB 標頭資訊。

模組與檔案選項
-modi=<uint>

對於從每個模組/編譯單元傾印資訊的所有選項,限制為指定的模組。

-files

傾印有助於每個顯示模組的原始程式檔。

-il

傾印內嵌行資訊 (DEBUG_S_INLINEELINES CodeView 子區段)

-l

傾印行資訊 (DEBUG_S_LINES CodeView 子區段)

-modules

傾印編譯單元資訊

-xme

傾印跨模組匯出 (DEBUG_S_CROSSSCOPEEXPORTS CodeView 子區段)

-xmi

傾印跨模組匯入 (DEBUG_S_CROSSSCOPEIMPORTS CodeView 子區段)

符號選項
-globals

傾印全域符號記錄

-global-extras

傾印有關全域變數的額外資訊,例如雜湊桶和雜湊值。

-publics

傾印公開符號記錄

-public-extras

傾印有關公開變數的額外資訊,例如雜湊桶和雜湊值。

-symbols

傾印每個已傾印模組的符號(函數、變數等)。

-sym-data

針對每個因 -symbols 選項而傾印的符號記錄,同時以二進制形式顯示記錄的完整位元組。

類型記錄選項
-types

從 TPI 串流傾印 CodeView 類型記錄

-type-extras

從 TPI 串流傾印額外資訊,例如雜湊和類型索引偏移陣列。

-type-data

針對每個已傾印的類型記錄,同時以二進制形式顯示記錄的完整位元組。

-type-index=<uint>

僅傾印具有指定類型索引的類型。

-ids

從 IPI 串流傾印 CodeView 類型記錄。

-id-extras

從 IPI 串流傾印額外資訊,例如雜湊和類型索引偏移陣列。

-id-data

針對每個傾印的 ID 記錄,同時以二進位顯示記錄的完整位元組。

-id-index=<uint>

僅傾印具有指定十六進制類型索引的 ID 記錄。

-dependents

當與 -type-index-id-index 一起使用時,會傾印指定索引的整個相依性圖形,而不僅僅是具有指定索引的單一記錄。例如,如果類型索引 0x4000 是一個函數,其返回類型的索引為 0x3000,並且您指定 -dependents=0x4000,則這將會傾印這兩個記錄(以及樹狀結構中的任何其他相依項)。

其他選項
-all

隱含大多數其他選項。

-section-contribs

傾印區段貢獻。

-section-headers

傾印映像區段標頭。

-section-map

傾印區段映射。

-string-table

傾印 PDB 字串表。

位元組

用法:llvm-pdbutil bytes [選項] <輸入 PDB 檔案>

摘要

dump 子命令類似,bytes 子命令會顯示有關 PDB 檔案結構的低階資訊,但它用於更深層次的鑑識分析。 bytes 子命令會根據指定的命令列選項在 PDB 檔案中找到各種結構,並以十六進制傾印它們。例如,從事 PDB 發佈支援工作的人員會大量使用此功能,以便將一個 PDB 與另一個 PDB 進行比較,以確保位元組完全相容。僅僅比較整個檔案或整個串流的位元組是不夠的,因為相同的結構完全可以在兩個不同的 PDB 中的不同位置存在,而「找到」結構只是成功的一半。

選項

MSF 檔案選項
-block-range=<start[-end]>

從 MSF 檔案區塊的指定範圍傾印二進制數據。

-byte-range=<start[-end]>

從檔案中指定的位元組範圍傾印二進制數據。

-fpm

傾印 MSF 可用頁面映射。

-stream-data=<string>

傾印指定資料流的二進制數據。格式為 SN[:Start][@Size]。例如,-stream-data=7:3@12 傾印從資料流 7 的偏移量 3 開始的 12 個位元組。

PDB 資料流選項
-name-map

傾印 PDB 名稱映射的位元組

DBI 資料流選項
-ec

傾印 DBI 資料流的編輯和繼續映射子資料流。

-files

傾印 DBI 資料流的檔案資訊子資料流。

-modi

傾印 DBI 資料流的 modi 子資料流。

-sc

傾印 DBI 資料流的區段貢獻子資料流。

-sm

從 DBI 資料流傾印區段映射。

-type-server

從 DBI 資料流傾印類型伺服器映射。

模組選項
-mod=<uint>

將此類別中的所有選項限制為指定的模組索引。默認情況下,此類別中的選項將傾印所有模組的位元組。

-chunks

傾印每個模組的 C13 除錯子區段的位元組。

-split-chunks

當與 -chunks 一起指定時,將 C13 除錯子區段拆分為每個子區段類型的一個單獨區塊,並分別傾印它們。

-syms

從每個模組傾印符號記錄子資料流。

類型記錄選項
-id=<uint>

傾印具有給定類型索引的 IPI 資料流中的記錄。

-type=<uint>

傾印具有給定類型索引的 TPI 資料流中的記錄。

pdb2yaml

用法: llvm-pdbutil pdb2yaml [選項] <輸入 PDB 檔案>

摘要

選項

yaml2pdb

用法: llvm-pdbutil yaml2pdb [選項] <輸入 YAML 檔案>

摘要

從 YAML 描述產生 PDB 檔案。YAML 語法在此不作說明。請改用 llvm-pdbutil pdb2yaml 並檢查輸出以取得範例起點。

選項

-pdb=<檔案名稱>

將產生的 PDB 寫入指定的檔案。

合併

用法: llvm-pdbutil merge [選項] <輸入 PDB 檔案 1> <輸入 PDB 檔案 2>

摘要

將兩個 PDB 檔案合併成單一檔案。

選項

-pdb=<檔案名稱>

將產生的 PDB 寫入指定的檔案。