其他 DBH 範例
以下是可在 DBH 提示字元發出之命令的其他範例。
顯示私人符號和公用符號
如果目標是完整的符號檔,則每個公用符號都會出現在檔案中:公用符號資料表和私用符號資料中的兩次。 公用符號表中的複本通常包含 (前置詞和尾碼) 的各種裝飾。 如需詳細資訊,請參閱 公用和私人符號。
DBH 可以從私用符號資料、不裝飾的公用符號資料表,以及從具有裝飾的公用符號資料表顯示此符號的相關資訊。 以下是一個範例,其中每一次都會使用命令 addr 414fe0 來顯示這三者。
第一次出現此命令時,DBH 會使用預設符號選項,因此產生的資訊來自私用符號資料。 請注意,這項資訊包括 函式 fgets的位址、大小和資料類型。 然後,會使用命令符號 +4000,這會開啟 [SYMOPT_PUBLICS_ONLY] 選項。 這會導致 DBH 忽略私用符號資料,因此,第二次執行 addr 414fe0 命令時,DBH 會使用公用符號資料表,而且不會顯示函式 fgets的大小或資料類型資訊。 最後,會使用命令符號 -2,關閉 [SYMOPT_UNDNAME] 選項,並導致 DBH 包含裝飾。 當 addr 414fe0 在此最後一次執行時,它會顯示函式名稱的裝飾版本, _fgets。
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 113
flags : 0
type : 7e
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 7d
pid:4308 mod:TimeTest[400000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
pid:4308 mod:TimeTest[400000]: addr 414fe0
fgets
name : fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
pid:4308 mod:TimeTest[400000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
pid:4308 mod:TimeTest[400000]: addr 414fe0
_fgets
name : _fgets
addr : 414fe0
size : 0
flags : 0
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 7f
如果使用了 -d 命令列選項,結果就會顯示開頭的裝飾公用名稱。
判斷特定符號的裝飾
DBH 可以判斷特定符號上的裝飾。 當與需要指定符號的程式搭配使用時,這非常有用,例如 PDBCopy。
例如,假設您知道符號檔 mysymbols.pdb 包含未取消編碼名稱為 MyFunction1 的符號。 若要尋找裝飾的名稱,請使用下列程式。
首先,啟動不含 -d 命令列選項的 DBH,然後使用 symopt +4000 命令,讓所有資訊都來自公用符號資料表:
C:\> dbh c:\mydir\mysymbols.pdb
mysymbols [1000000]: symopt +4000
Symbol Options: 0x10c13
Symbol Options: 0x14c13
接下來,使用 name 命令或 列舉 命令來顯示所需符號的位址:
mysymbols [1000000]: enum myfunction1
index address name
2ab 102cb4e : MyFunction1
現在,使用 symopt -2 讓符號裝飾可見,然後使用 addr 命令搭配此符號的位址:
mysymbols [1000000]: symopt -2
Symbol Options: 0x14c13
Symbol Options: 0x14c11
mysymbols [1000000]: addr 102cb4e
_MyFunction1@4
name : _InterlockedIncrement@4
addr : 102cb4e
size : 0
flags : 0
type : 0
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagPublicSymbol (a)
index : 2ab
這會顯示符號的裝飾名稱 _MyFunction1@4。
解碼符號裝飾
undec命令可用來顯示 C++ 符號裝飾的意義。 在下列範例中,附加至 ?? 的裝飾_C@_03GGCAPAJC@Sep?$AA@ 會解碼,以指出它是字串:
dbh: undec ??_C@_03GGCAPAJC@Sep?$AA@
??_C@_03GGCAPAJC@Sep?$AA@ =
`string'
下列範例會將附加至三個函式名稱的裝飾解碼,並顯示其原型:
dbh: undec ?gcontext@@3_KA
?gcontext@@3_KA =
unsigned __int64 gcontext
dbh: undec ?pathcpy@@YGXPAGPBG1K@Z
?pathcpy@@YGXPAGPBG1K@Z =
void __stdcall pathcpy(unsigned short *,unsigned short const *,unsigned short const *,unsigned long)
dbh: undec ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z =
int (__cdecl*__cdecl _set_new_handler(int (__cdecl*)(unsigned int)))(unsigned int)
undec命令不會顯示初始底線、前置詞__imp_或尾端「 @位址」裝飾的相關資訊,這些裝飾通常附加至函式名稱。
您可以使用 undec 命令搭配任何字串,而不只是目前載入模組中的符號名稱。
依位址排序符號清單
如果您只是想要以位址順序排序的符號清單,您可以在批次模式中執行 DBH,並將結果管線傳送至 排序 命令。 位址值通常會在每個行的第 18 個數據行中開始,因此下列命令會依位址排序結果:
dbh -p:4672 enum mymodule!* | sort /+18
顯示源行資訊
當您使用完整符號檔時,DBH 可以顯示源行資訊。 這不需要存取任何來源檔案,因為這項資訊會儲存在符號檔本身。
在這裡, line 命令會顯示對應至指定來源行之二進位指令的十六進位位址,並顯示與該行相關聯的符號。 (在此範例中,沒有與 line 相關聯的符號。)
dbh [1000000]: line myprogram.cpp#767
file : e:\mydirectory\src\myprogram.cpp
line : 767
addr : 1006191
key : 0000000000000000
disp : 0
在這裡, srclines 命令會顯示與指定之來源行相關聯的物件檔案:
dbh [1000000]: srclines myprogram.cpp 767
0x1006191: e:\mydirectory\objchk\amd64\myprogram.obj
line 767 e:\mydirectory\src\myprogram.cpp
請注意, srclines 的輸出類似于 ln (列出最接近符號) 偵錯工具命令的輸出。
顯示資料類型
type命令可用來顯示資料類型的相關資訊。 在這裡會顯示 CMDPROC 類型的相關資料:
dbh [1000000]: type CMDPROC
name : CMDPROC
addr : 0
size : 8
flags : 0
type : c
modbase : 1000000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagTypedef (11)
index : c
在 「tag」 之後列出的值會指定此資料類型的本質。 在此情況下, SymTagTypedef 表示此類型是使用 typedef 語句來定義。
使用虛數符號
add命令可以將虛數符號新增至載入的模組。 實際的符號檔不會改變;只會變更 DBH 記憶體中該檔案的影像。
如果您想要暫時覆寫哪些符號與指定的位址範圍相關聯, 則 add 命令會很有用。 在下列範例中,虛構符號MyModule!magic會覆寫與MyModule!main相關聯的位址範圍部分。
以下是新增虛數符號之前模組的顯示方式。 請注意, main 函式會從0x0042CC56開始,而且大小0x42B。 因此,當 addr 命令與位址0x0042CD10搭配使用時,它會將此位址辨識為在 main 函式的界限內:
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
pid:6040 mod:MyModule[400000]: addr 42cc56
main
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
pid:6040 mod:MyModule[400000]: addr 42cd10
main+ba
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
現在,符號 magic 會新增至位址0x0042CD00,大小為 0x10 位元組。 使用 列舉 命令時,會設定索引中的高位,顯示這是虛構符號:
pid:6040 mod:MyModule[400000]: add magic 42cd00 10
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
80000001 42cd00 : magic
使用 addr 命令時,它會尋找範圍包含指定位址的任何符號。 由於此搜尋會以指定的位址開始,並回溯執行,因此位址0x004CD10現在會與 magic相關聯。 另一方面,位址0x004CD40仍然與 main相關聯,因為它位於 magic 符號的範圍之外。 另請注意, 標記 SymTagCustom 表示虛構符號:
pid:6040 mod:MyModule[400000]: addr 42cd10
magic+10
name : magic
addr : 42cd00
size : 10
flags : 1000
type : 0
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagCustom (1a)
index : 80000001
pid:6040 mod:MyModule[400000]: addr 42cd40
main+ea
name : main
addr : 42cc56
size : 42b
flags : 0
type : 2
modbase : 400000
value : 0
reg : 0
scope : SymTagNull (0)
tag : SymTagFunction (5)
index : 1
最後, del 命令可以刪除符號 magic,將所有符號傳回至其原始範圍:
pid:6040 mod:MyModule[400000]: del magic
pid:6040 mod:MyModule[400000]: enum timetest!ma*
index address name
1 42cc56 : main
3 415810 : malloc
5 415450 : mainCRTStartup
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應