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 篩選器優先於 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 檔案中所有流的摘要。
- -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 字串表。
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 除錯子區段的位元組。
- -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 寫入到指定檔案。