次の方法で共有


その他の DBH の例

ここでは、DBH プロンプトで発行できるコマンドのその他の例を示します。

プライベート シンボルとパブリック シンボルの表示

ターゲットが完全なシンボル ファイルの場合、各パブリック シンボルは、パブリック シンボル テーブルとプライベート シンボル データのファイルに 2 回表示されます。 パブリック シンボル テーブルのコピーには、多くの場合、さまざまな装飾 (プレフィックスとサフィックス) が含まれています。 詳細については、「パブリック シンボルとプライベート シンボル」を参照してください。

DBH では、プライベート シンボル データ、装飾なしのパブリック シンボル テーブル、および装飾付きのパブリック シンボル テーブルから、このシンボルに関する情報を表示できます。 コマンド addr 414fe0 を毎回使用して、これら 3 つすべてを表示する例を次に示します。

この例でこのコマンドが初めて表示される場合、DBH は既定のシンボル オプションを使用するため、結果の情報はプライベート シンボル データから取得されます。 この情報には、関数 fgets のアドレス、サイズ、およびデータ型が含まれることに注意してください。 次に、コマンド symopt +4000 が使用され、SYMOPT_PUBLICS_ONLY オプションがオンになります。 これにより、DBH はプライベート シンボル データを無視するため、addr 414fe0 コマンドを 2 回目に実行すると、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 コマンドまたは enum コマンドを使用して、目的のシンボルのアドレスを表示します。

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' 

次の例では、3 つの関数名にアタッチされている装飾をデコードし、プロトタイプを明らかにします。

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_、または末尾の "@address" 装飾に関する情報は表示されません。これは、関数名にアタッチされているのが一般的です。

undec コマンドは、現在読み込まれているモジュール内のシンボルの名前だけでなく、任意の文字列で使用できます。

アドレスによるシンボルの一覧の並べ替え

アドレス順に並べ替えられたシンボルのリストが必要な場合は、バッチ モードで DBH を実行し、結果を sort コマンドにパイプできます。 通常、アドレス値は各行の 18 番目の列から始まるので、次のコマンドはアドレスで結果を並べ替えます。

dbh -p:4672 enum mymodule!* | sort /+18

ソース行情報の表示

完全シンボル ファイルを使用すると、DBH はソース行情報を表示できます。 この情報はシンボル ファイル自体に格納されるため、ソース ファイルへのアクセスは必要ありません。

ここでは、line コマンドは、指定されたソース行に対応するバイナリ命令の 16 進数アドレスを表示し、その行に関連付けられているシンボルを表示します。 (この例では、線に関連付けられたシンボルはありません)。

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 (List Nearest Symbols) デバッガー コマンドの出力と似ています。

データ型の表示

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!main に関連付けされているアドレス範囲の一部が、虚数シンボル MyModule!magic によってオーバーライドされます。

虚数シンボルが追加される前にモジュールがどのように表示されるかを次に示します。 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 バイトになります。 enum コマンドを使用すると、インデックス内の上位ビットが設定され、これが虚数シンボルであることを示します。

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 は magic シンボルの範囲外にあるため、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