共用方式為


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