その他の 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