其他 DBH 範例
以下是可在 DBH 提示字元發出之命令的其他範例。
顯示私人符號和公用符號
如果目標是完整的符號檔,則每個公用符號都會出現在檔案中:在公用符號數據表中,以及私用符號數據中出現兩次。 公用符號數據表中的複本通常包含各種裝飾專案(前置詞和後綴)。 如需詳細資訊,請參閱 公用和私人符號。
DBH 可以從私人符號數據、不含裝飾的公用符號數據表,以及具有裝飾的公用符號數據表,顯示此符號的相關信息。 以下是每次使用命令 addr 414fe0 顯示這三個範例的範例。
第一次出現此命令時,DBH 會使用預設符號選項,因此產生的信息來自私人符號數據。 請注意,這項資訊包括函式 fgets 的位址、大小和數據類型。 接著,會使用命令 symopt +4000,這會開啟 [SYMOPT_PUBLICS_ONLY] 選項。 這會導致 DBH 忽略私人符號數據,因此當 addr 414fe0 命令第二次執行時,DBH 會使用公用符號數據表,而且不會顯示函式 fget 的大小或數據類型資訊。 最後,使用命令 symopt -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 命令會顯示對應至指定來源行之二進位指令的十六進位位址,並顯示與該行相關聯的符號。 (在此範例中,沒有與這一行相關聯的符號。
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相關聯,因為它位於魔術符號的範圍之外。 另請注意, 標記 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