llvm-pdbutil - PDB 檔案鑑識與診斷¶
語法¶
llvm-pdbutil [子命令] [選項]
說明¶
顯示 PDB 檔案中的類型、符號、CodeView 記錄和其他資訊,以及操作和建立 PDB 檔案。 llvm-pdbutil 通常由基於 FileCheck 的測試使用,用於測試 LLVM 的 PDB 讀取和寫入功能,但也可以用於一般的 PDB 檔案調查和鑑識,或作為 cvdump 的替代品。
子命令¶
llvm-pdbutil 分為幾個子命令,每個子命令都針對不同的目的量身打造。以下是每個命令的簡要摘要,後續章節將提供更多詳細資訊。
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 檔案中所有串流的摘要。
- -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¶
傾印每個已傾印模組的符號(函數、變數等)。
類型記錄選項¶
- -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 除錯子區段的位元組。
- -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 寫入指定的檔案。