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 檔案,產生檔案的部分或全部 YAML 描述,以便可以重建 PDB。

  • 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 篩選器優先於 include 篩選器。因此,如果篩選器同時符合包含和排除規則,則會被排除。

-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>

僅顯示類型 T,其中 sizeof(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 字串表。

bytes

用法: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 傾印 12 個位元組,從流中的偏移量 3 開始。

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=<file-name>

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

merge

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

摘要

將兩個 PDB 檔案合併為單個檔案。

選項

-pdb=<file-name>

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