Share via


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