x (シンボルの検証)
X コマンドは、指定されたパターンに一致するすべてのコンテキストのシンボルを表示します。
x [Options] Module!Symbol
x [Options] *
パラメーター
オプション シンボル検索オプションを指定します。 次のオプションを 1 つ以上使用できます。
/0
各シンボルのアドレスのみを表示します。
/1
各シンボルの名前のみを表示します。
/2
各シンボルのアドレスと名前のみを表示します (データ型は表示しません)。
/D
デバッガ マークアップ言語を使用して出力を表示します。
/t
データ型がわかっている場合は、各シンボルのデータ型を表示します。
/v
各シンボルのシンボル タイプ (ローカル、グローバル、パラメータ、関数、または不明) を表示します。 このオプションでは、各シンボルのサイズも表示されます。 関数シンボルのサイズは、メモリ内の関数のサイズです。 他のシンボルのサイズは、そのシンボルが表すデータ型のサイズとなります。 サイズは常にバイト単位で測定され、16 進形式で表示されます。
/s Size
サイズ (バイト単位) が Size の値と等しいシンボルのみを表示します。 関数シンボルのサイズは、メモリ内の関数のサイズです。 他のシンボルのサイズは、そのシンボルが表すデータ型のサイズとなります。 サイズが決定できないシンボルは常に表示されます。 サイズはゼロ以外の整数である必要があります。
/q
シンボル名を引用符で囲んだ形式で表示します。
/p
デバッガーが関数名とその引数を表示するときに、開き括弧の前のスペースを省略します。 この種の表示は、関数名と引数を x 表示から別の場所にコピーする場合に簡単になります。
/f
関数のデータサイズを表示します。
/d
データのデータサイズを表示します。
/a
表示をアドレスの昇順に並べ替えます。
/A
表示をアドレスの降順に並べ替えます。
/n
表示を名前の昇順に並べ替えます。
/N
表示を名前の降順に並べ替えます。
/z
表示をサイズの昇順に並べ替えます。
/Z
表示をサイズの降順に並べ替えます。
Module
検索するモジュールを指定します。 このモジュールは、.exe、.dll、または .sys ファイルです。 モジュールには、さまざまなワイルドカード文字と指定子を含めることができます。 構文の詳細については、次を参照してください。文字列ワイルドカード構文します。
Symbol
シンボルに含める必要があるパターンを指定します。 シンボルには、さまざまなワイルドカード文字と指定子を含めることができます。 構文の詳細については、次を参照してください。文字列ワイルドカード構文します。
このパターンはシンボルと照合されるため、照合では大文字と小文字は区別されず、先頭の 1 つのアンダースコア (_) は任意の数の先頭のアンダースコアを表します。 Symbol 内にスペースを追加すると、ワイルドカード文字を使用せずにスペースを含むシンボル名 (「operator new」や「Template<A, B>」など) を指定できます。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
解説
次のコマンドは、MyModule 内で文字列「spin」を含むすべてのシンボルを検索します。
0:000> x mymodule!*spin*
次のコマンドは、MyModule 内の「DownloadMinor」および「DownloadMajor」シンボルをすばやく見つけます。
0:000> x mymodule!downloadm??or
次のコマンドを使用して、MyModule 内のすべてのシンボルを表示することもできます。
0:000> x mymodule!*
上記のコマンドは、デバッガーに MyModule からシンボル情報を強制的に再ロードすることもします。 最小限の表示でモジュール内のシンボルを再ロードする場合は、次のコマンドを使用します。
0:000> x mymodule!*start*
いくつかのシンボルには常に「start」という文字列が含まれています。 したがって、前述のコマンドは、コマンドが機能することを確認するために常に何らかの出力を表示します。 ただし、上記のコマンドは、x mymodule!* の過剰な表示長を回避します。
ディスプレイには、各シンボルの開始アドレスと完全なシンボル名が表示されます。 シンボルが関数名の場合、その引数の型のリストも表示されます。 シンボルがグローバル変数の場合は、その現在の値が表示されます。
x コマンドには特殊なケースがもう 1 つあります。 現在のコンテキストのすべてのローカル変数のアドレスと名前を表示するには、次のコマンドを使用します。
0:000> x *
注 ほとんどの場合、プライベート シンボルがロードされていない限り、ローカル変数にアクセスできません。 この状況の詳細については、dbgerr005: プライベートシンボルが必要ですを参照してください。 ローカル変数の値を表示するには、dv (ローカル変数の表示) コマンドを使用します。
次の例は、/0、/1、および /2 オプションを示しています。
0:000:x86> x /0 MyApp!Add*
00b51410
00b513d0
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers
0:000:x86> x /2 MyApp!Add*
00b51410 MyApp!AddThreeIntegers
00b513d0 MyApp!AddTwoIntegers
/0、/1、および /2 オプションは、x コマンドの出力を .foreach コマンドへの入力として使用する場合に便利です。
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
次の例は、モジュール notepad.exe の関数をフィルタリングするためにスイッチ /f を使用する場合を示しています。
0:000> x /f /v notepad!*main*
prv func 00000001`00003340 249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func 00000001`0000a7b0 1c notepad!WinMainCRTStartup$filt$0 (void)
prv func 00000001`0000a540 268 notepad!WinMainCRTStartup (void)
/v オプションを使用すると、表示の最初の列にシンボル タイプ (ローカル、グローバル、パラメータ、関数、または不明) が表示されます。 2 列目はシンボルのアドレスです。 3 列目はシンボルのサイズ (バイト単位) です。 4 列目はモジュール名とシンボル名を示します。 場合によっては、この表示の後に等号 (=) が続き、その後にシンボルのデータ型が続きます。 シンボルのソース (公開または完全なシンボル情報) も表示されます。
kd> x /v nt!CmType*
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68 150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0 0 nt!CmTypeString = unsigned short *[]
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
前述の例では、サイズは 16 進形式で指定され、データ型は 10 進形式で指定されています。 したがって、前の例の最後の行では、データ型は符号なし短整数への 42 個のポインターの配列になります。 この配列のサイズは 42*4 = 168 で、168 は 16 進形式で 0xA8 として表示されます。
/s Size オプションを使用すると、サイズ (バイト単位) が特定の値であるシンボルのみを表示できます。 たとえば、前の例のコマンドを、サイズが 0xA8 のオブジェクトを表すシンボルに制限できます。
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
データ型の操作
/t オプションを使用すると、デバッガーは各シンボルのデータ型に関する情報を表示します。 多くのシンボルでは、/t オプションを指定しなくても、この情報が表示されることに注意してください。 /tを使用すると、そのようなシンボルのデータ型情報が 2 回表示されます。
0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>
0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>
x コマンドは、型のインスタンスを表示します。
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
x コマンドは、型の名前だけに基づいて何も表示しません。
0:001> x foo!MyClass
0:001>
型の名前を使用して型情報を表示するには、dt (Display Type) の使用を検討してください。これは、型と型のインスタンスの両方の情報を提供します。
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
テンプレートの使用
このサンプルに示すように、x コマンドでワイルド カードを使用してテンプレート クラスを表示できます。
0:001> x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)
X コマンドでは個々のテンプレート クラス項目が表示されないため、テンプレートを操作する場合は dt (Display Type) コマンドの使用を検討してください。
0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
+0x000 __VFN_table : Ptr64
+0x008 componentConfig_ : Ptr64 Common::ComponentConfig
+0x010 section_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
+0x038 key_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >