dt (タイプの表示)
dt コマンドは、ローカル変数、グローバル変数、またはデータ タイプに関する情報を表示します。 これにより、構造体や共用体だけでなく、シンプルなデータ タイプに関する情報も表示できます。
ユーザー モードの構文
dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
カーネルモード構文
[Processor] dt [-DisplayOpts] [-SearchOpts] [module!]Name [[-SearchOpts] Field] [Address] [-l List]
dt [-DisplayOpts] Address [-l List]
dt -h
パラメーター
Processor
必要な情報を含むプロセスを実行しているプロセッサを指定します。 詳細については、「マルチ プロセッサの構文」を参照してください。 プロセッサはカーネル モードでのみ指定できます。
DisplayOpts
次の表に示しているオプションを 1 つ以上指定します。 これらのオプションはハイフンで始まります。
オプション | 説明 |
---|---|
-a[quantity] |
配列の各要素をそのインデックスと共に新しい行に表示します。 合計 quantity 個の要素が表示されます。 a と quantity の間にスペースを入れないでください。 a の後に数値が続かない場合は、配列内のすべての項目が表示されます。 -a[quantity] スイッチは、この方法で表示する各タイプ名またはフィールド名の直前に指定する必要があります。 |
-b |
ブロックを再帰的に表示します。 表示される構造体が部分構造体を含む場合、任意の深さまで再帰的に展開され、全体が表示されます。 ポインターは部分構造体ではなく、元の構造内にある場合のみ展開されます。 |
-c |
コンパクト出力。 可能であれば、すべてのフィールドが 1 行に表示されます。 (-a スイッチと共に使用すると、各配列要素は複数行のブロックとして書式設定されるのではなく、1 行になります。) |
-d |
Name の末尾にアスタリスクを付けると、Name で始まるすべてのタイプについて詳細出力が表示されます。 Name の末尾にアスタリスクを付けない場合は、指定した Name のタイプについて詳細出力が表示されます。 |
-e |
dt は、タイプを列挙するようになります。 このオプションは、dt が Name 値をタイプではなくインスタンスとして誤って解釈する場合にのみ必要です。 |
-i |
サブタイプをインデントしないでください。 |
-o |
構造体フィールドのオフセット値を省略します。 |
-p |
Address は、仮想アドレスではなく物理アドレスです。 |
-r[depth] |
サブタイプ フィールドを再帰的にダンプします。 depth を指定した場合、この再帰は depth レベルの後に停止します。 depth は 1 から 9 までの数字である必要があり、r と depth の間にスペースを入れないでください。 -r[depth] スイッチはアドレスの直前に指定する必要があります。 |
-s size |
バイト単位のサイズが size の値と等しいタイプのみを列挙します。 s オプションは、タイプを列挙する場合にのみ便利です。 -s を指定すると、常に -e も暗黙的に指定されます。 |
-t |
タイプのみを列挙します。 |
-v |
詳細出力。 これにより、構造体の合計サイズやその要素の数などの追加情報が得られます。 これを -y 検索オプションと共に使用すると、すべてのシンボルが表示され、タイプ情報が関連付けられていないシンボルも表示されます。 |
SearchOpts
次の表に示しているオプションを 1 つ以上指定します。 これらのオプションはハイフンで始まります。
オプション | 説明 |
---|---|
-n |
これは、次のパラメーターが名前であることを示します。 次の項目が 16 進文字でのみ構成されている場合は、このオプションを使用する必要があります。それにより、アドレスとして扱われなくなります。 |
-y |
これは、次のパラメーターが名前の先頭であり、必ずしも名前全体ではないことを示します。 -y を指定すると、すべての一致のリストが作成され、その後にリスト内の最初の一致に関する詳細情報が表示されます。 -y を指定しない場合は、完全一致のみが表示されます。 |
module
この構造体を定義するモジュールを指定する省略可能なパラメーター。 グローバル変数またはタイプと同じ名前のローカル変数またはタイプがある場合は、module を含めて、グローバル変数であることを指定する必要があります。 そのように指定しない場合、dt コマンドは、ローカル変数が大文字と小文字を区別しない一致であり、グローバル変数が大文字と小文字を区別する一致であっても、ローカル変数を表示してしまいます。
Name
タイプまたはグローバル変数の名前を指定します。 Name の末尾にアスタリスク (*) を付けると、すべての一致の一覧が表示されます。 したがって、dt A\* では、「A」で始まるすべてのデータ タイプ、グローバル変数、および静的データの一覧が表示されますが、これらのタイプの実際のインスタンスは表示されません。 (-v 表示オプションを同時に使用すると、タイプ情報が関連付けられているシンボルだけでなく、すべてのシンボルが表示されます。) また、Name をピリオド (.) に置き換えることで、直近に使用した Name の値を再度使用するように指定することもできます。
Name にスペースが含まれている場合は、かっこで囲む必要があります。
Field
表示するフィールドを指定します。 Field を省略した場合は、すべてのフィールドが表示されます。 Field の後にピリオド (.) が続く場合、このフィールドの第 1 レベルのサブ フィールドも表示されます。 Field の後に一連のピリオドが続く場合、サブ フィールドはピリオドの数に等しい深さまで表示されます。 ピリオドが続くフィールド名は、-y 検索オプションを使用したときと同様に、プレフィックス一致として扱われます。 Field にアスタリスク (*) が続く場合、フィールド全体である必要はなく、フィールドの先頭のみとして扱われ、一致するフィールドがすべて表示されます。
Address
表示する構造体のアドレスを指定します。 Name を省略した場合、Address は必須であり、グローバル変数のアドレスを指定する必要があります。 特に指定がない限り、Address は仮想アドレスとして扱われます。 物理アドレスを指定するには、-p オプションを使用します。 レジスタを指定するには、マットマーク (@) を使用します (@eax など)。
List
リンク リストをリンクするフィールド名を指定します。 Address パラメーターは必須です。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
追加情報
メモリ操作の概要とその他のメモリ関連のコマンドの説明については、「メモリの読み取りと書き込み」を参照してください。
解説
dt コマンドの出力では、符号付き数値は 10 進数、符号なし数値は 16 進数で表示されます。
シンボル値を指定できる dt のすべてのパラメーターでは、文字列ワイルドカードも指定できます。 詳細については、「文字列ワイルドカードの構文」を参照してください。
-y および -n オプションは任意の Name または Field の前に付けることができます。 y オプションを使用すると、タイプ名または構造体名の先頭を指定できます。 たとえば、dt -y ALLEN を使用すると、ALLENTOWN タイプに関するデータが表示されます。 ただし、dt -y A を使用して ALLENTOWN タイプを表示することはできません。代わりに、dt -ny A を使用する必要があります。これは、A は有効な 16 進値であり、-n オプションを指定しないとアドレスとして解釈されるためです。
Name が構造体を示している場合、すべてのフィールドが表示されます (dt myStruct など)。 特定の 1 つのフィールドのみが必要な場合は、dt myStruct myField を実行できます。 これにより、C 言語で myStruct.myField という名前のメンバーが表示されます。 ただし、dt myStruct myField1 myField2 コマンドでは、myStruct.myField1 と myStruct.myField2 が表示されます。 myStruct.myField1.myField2 は表示されません。
構造体名またはフィールドの後に添字が続く場合は、これは配列の 1 つのインスタンスを指定します。 たとえば、dt myStruct myFieldArray[3] は、該当する配列の 4 番目の要素を表示します。 ただし、タイプ名の後に添字が続く場合は、配列全体を指定します。 たとえば、dt CHAR[8] myPtr は 8 文字の文字列を表示します。 添字は、現在の基数に関わらず、常に 10 進数として扱われます。0x プレフィックスを付けると、エラーが発生します。
このコマンドは .pdb ファイルからのタイプ情報を使用するため、どの CPU プラットフォームのデバッグにも自由に使用できます。
dt が使用するタイプ情報には、Windows で定義されているすべてのタイプを含め、typedef で作成されたすべてのタイプ名が含まれます。 たとえば、unsigned long と char は有効なタイプ名ではありませんが、ULONG と CHAR は有効です。 Windows のすべてのタイプ名のリストについては、Microsoft Windows SDK を参照してください。
自分のコード内で typedef により作成したタイプは、自分のプログラムで実際に使用されている限り、すべて存在します。 ただし、ヘッダーに定義されているが実際には使用されていないタイプは、.pdb シンボル ファイルに保存されず、デバッガーからはアクセスできません。 そのようなタイプをデバッガーで使用できるようにするには、typedef ステートメントの input として使用します。 たとえば、次のようにコードに記述すると、構造体 MY_DATA は .pdb シンボル ファイルに保存され、dt コマンドにより表示できるようになります。
typedef struct _MY_DATA {
. . .
} MY_DATA;
typedef MY_DATA *PMY_DATA;
一方、次のコードは十分ではありません。MY_DATA と PMY_DATA の両方が最初の typedef によって定義されており、したがって MY_DATA 自体が typedef ステートメントの入力として使用されていないためです。
typedef struct _MY_DATA {
. . .
} MY_DATA, *PMY_DATA;
いずれにせよ、タイプ情報は完全なシンボル ファイルにのみ含まれ、プライベート シンボル情報がすべて削除されたシンボル ファイルには含まれません。 詳細については、「パブリック シンボルとプライベート シンボル」を参照してください。
Unicode 文字列を表示する場合は、先に .enable_unicode (Unicode 表示の有効化) コマンドを使用する必要があります。 .enable_long_status (長整数表示の有効化) コマンドを使用すると、長整数の表示を制御できます。
次の例では、dt を使用してグローバル変数を表示しています。
0:000> dt mt1
+0x000 a : 10
+0x004 b : 98 'b'
+0x006 c : 0xdd
+0x008 d : 0xabcd
+0x00c gn : [6] 0x1
+0x024 ex : 0x0
次の例では、dt を使用して配列フィールド gn を表示しています。
0:000> dt mt1 -a gn
+0x00c gn :
[00] 0x1
[01] 0x2
[02] 0x3
[03] 0x4
[04] 0x5
[05] 0x6
次のコマンドは、変数のいくつかのサブ フィールドを表示します。
0:000> dt mcl1 m_t1 dpo
+0x010 dpo : DEEP_ONE
+0x070 m_t1 : MYTYPE1
次のコマンドは、フィールド m_t1 のサブ フィールドを表示します。 ピリオドによりプレフィックスの照合が自動的に行われるため、「m_t1」で始まるフィールドのサブ フィールドも表示されます。
0:000> dt mcl1 m_t1.
+0x070 m_t1 :
+0x000 a : 0
+0x004 b : 0 '
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
この処理を任意の深さまで繰り返すことができます。 たとえば、コマンド dt mcl1 a..c. を使用すると、最初のフィールド名が a で始まり、3 番目のフィールド名が c で始まるような、深さ 4 までのすべてのフィールドが表示されます。
サブ フィールドがどのように表示されるかの、より詳細な例を次に示します。 まず、Ldr フィールドを表示します。
0:000> dt nt!_PEB Ldr 7ffdf000
+0x00c Ldr : 0x00191ea0
次に、ポインター タイプ フィールドを展開します。
0:000> dt nt!_PEB Ldr Ldr. 7ffdf000
+0x00c Ldr : 0x00191ea0
+0x000 Length : 0x28
+0x004 Initialized : 0x1 '
+0x008 SsHandle : (null)
+0x00c InLoadOrderModuleList : _LIST_ENTRY [ 0x191ee0 - 0x192848 ]
+0x014 InMemoryOrderModuleList : _LIST_ENTRY [ 0x191ee8 - 0x192850 ]
+0x01c InInitializationOrderModuleList : _LIST_ENTRY [ 0x191f58 - 0x192858 ]
+0x024 EntryInProgress : (null)
次に、CriticalSectionTimeout フィールドを表示します。
0:000> dt nt!_PEB CriticalSectionTimeout 7ffdf000
+0x070 CriticalSectionTimeout : _LARGE_INTEGER 0xffffe86d`079b8000
次に、CriticalSectionTimeout 構造体のサブ フィールドをもう 1 レベル深く展開します。
0:000> dt nt!_PEB CriticalSectionTimeout. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u : __unnamed
+0x000 QuadPart : -25920000000000
最後に、CriticalSectionTimeout 構造体のサブ フィールドをもう 2 レベル深く展開します。
0:000> dt nt!_PEB CriticalSectionTimeout.. 7ffdf000
+0x070 CriticalSectionTimeout : 0xffffe86d`079b8000
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 u :
+0x000 LowPart : 0x79b8000
+0x004 HighPart : -6035
+0x000 QuadPart : -25920000000000
次のコマンドは、アドレス 0x0100297C に位置するデータ タイプ MYTYPE1 のインスタンスを表示します。
0:000> dt 0x0100297c MYTYPE1
+0x000 a : 22
+0x004 b : 43 '+'
+0x006 c : 0x0
+0x008 d : 0x0
+0x00c gn : [6] 0x0
+0x024 ex : 0x0
次のコマンドは、アドレス 0x01002BE0 にある 10 個の ULONG 配列を表示します。
0:000> dt -ca10 ULONG 01002be0
[0] 0x1001098
[1] 0x1
[2] 0xdead
[3] 0x7d0
[4] 0x1
[5] 0xcd
[6] 0x0
[7] 0x0
[8] 0x0
[9] 0x0
次のコマンドは、前の表示を別のアドレスで続けます。 「ULONG」を再入力する必要はありません。
0:000> dt -ca4 . 01002d00
Using sym ULONG
[0] 0x12
[1] 0x4ac
[2] 0xbadfeed
[3] 0x2
タイプの表示の例をいくつか次に示します。 次のコマンドは、モジュール thismodule 内で「MY」という文字列で始まるすべてのタイプとグローバル変数を表示します。 アドレスが先頭にあるものは実際のインスタンスで、アドレスがないものはタイプ定義です。
0:000> dt thismodule!MY*
010029b8 thismodule!myglobal1
01002990 thismodule!myglobal2
thismodule!MYCLASS1
thismodule!MYCLASS2
thismodule!MYCLASS3
thismodule!MYTYPE3::u
thismodule!MYTYPE1
thismodule!MYTYPE3
thismodule!MYTYPE3
thismodule!MYFLAGS
タイプを表示するとき、-v オプションを使用することで各項目のサイズを表示できます。 -s size オプションは、特定のサイズのアイテムのみを列挙するために使用できます。 ここでも、アドレスが先頭にあるものは実際のインスタンスで、アドレスがないものはタイプ定義です。
0:001> dt -s 2 -v thismodule!*
Enumerating symbols matching thismodule!*, Size = 0x2
Address Size Symbol
002 thismodule!wchar_t
002 thismodule!WORD
002 thismodule!USHORT
002 thismodule!SHORT
002 thismodule!u_short
002 thismodule!WCHAR
00427a34 002 thismodule!numberOfShips
00427a32 002 thismodule!numberOfPlanes
00427a30 002 thismodule!totalNumberOfItems
-b オプションの例を次に示します。 構造体が展開され、その中の OwnerThreads 配列が展開されますが、Flink および Blink リスト ポインターはたどられません。
kd> dt nt!_ERESOURCE -b 0x8154f040
+0x000 SystemResourcesList : [ 0x815bb388 - 0x816cd478 ]
+0x000 Flink : 0x815bb388
+0x004 Blink : 0x816cd478
+0x008 OwnerTable : (null)
+0x00c ActiveCount : 1
+0x00e Flag : 8
+0x010 SharedWaiters : (null)
+0x014 ExclusiveWaiters : (null)
+0x018 OwnerThreads :
[00]
+0x000 OwnerThread : 0
+0x004 OwnerCount : 0
+0x004 TableSize : 0
[01]
+0x000 OwnerThread : 0x8167f563
+0x004 OwnerCount : 1
+0x004 TableSize : 1
+0x028 ContentionCount : 0
+0x02c NumberOfSharedWaiters : 0
+0x02e NumberOfExclusiveWaiters : 0
+0x030 Address : (null)
+0x030 CreatorBackTraceIndex : 0
+0x034 SpinLock : 0
カーネル モードでの dt の例を次に示します。 次のコマンドは、!process 0 0 と同様の結果を生成します。
kd> dt nt!_EPROCESS -l ActiveProcessLinks.Flink -y Ima -yoi Uni 814856f0
## ActiveProcessLinks.Flink at 0x814856f0
UniqueProcessId : 0x00000008
ImageFileName : [16] "System"
## ActiveProcessLinks.Flink at 0x8138a030
UniqueProcessId : 0x00000084
ImageFileName : [16] "smss.exe"
## ActiveProcessLinks.Flink at 0x81372368
UniqueProcessId : 0x000000a0
ImageFileName : [16] "csrss.exe"
## ActiveProcessLinks.Flink at 0x81369930
UniqueProcessId : 0x000000b4
ImageFileName : [16] "winlogon.exe"
....
リストの各要素に対して何らかのコマンドを実行する場合は、!list 拡張機能を使用します。
最後に、dt -h コマンドを実行して、dt の構文を要約した短いヘルプ テキストを表示します。