wt (データのトレースとウォッチ)
wt コマンドは、関数呼び出しの開始時にこのコマンドを実行すると、関数全体を実行してから統計を表示します。
wt [WatchOptions] [= StartAddress] [EndAddress]
パラメーター
WatchOptions
表示を変更する方法を指定します。 次のオプションのいずれかを使用できます。
オプション | 効果 |
---|---|
-l Depth |
(ユーザー モードのみ) 表示する通話の最大深さを指定します。 少なくとも開始点よりも Depth レベルが深い呼び出しはすべてサイレントに実行されます。 |
-m Module |
(ユーザー モードのみ) 表示を、指定されたモジュール内のコードと、そのモジュールから行われた最初のレベルの呼び出しに制限します。 複数の -m オプションを含めると、複数のモジュールからのコードを表示し、他のモジュールは表示しません。 |
-i Module |
(ユーザー モードのみ) 指定されたモジュール内のコードを無視します。 複数の -i オプションを含めて、複数のモジュールからのコードを無視できます。 -m オプションを使用すると、デバッガーはすべての -i オプションを無視します。 |
-ni |
(ユーザー モードのみ) -m または -i オプションのために無視されているコードへのエントリは表示されません。 |
-nc |
個別の通話情報は表示されません。 |
-ns |
概要情報を表示しません。 |
-nw |
トレース中に警告を表示しません。 |
-oa |
(ユーザー モードのみ) 呼び出しサイトの実際のアドレスを表示します。 |
-or |
(ユーザー モードのみ) デフォルトの基数をベースとして使用して、呼び出された関数の戻りレジスタ値を表示します。 |
-oR |
(ユーザー モードのみ) 呼び出された関数の戻りレジスタ値を、各戻り値の適切な型で表示します。 |
StartAddress
デバッガが実行を開始するアドレスを指定します。 StartAddress を使用しない場合、命令ポインタが指す命令から実行が開始されます。 構文の詳細については、「 アドレスとアドレス範囲の構文」を参照してください。
EndAddress
トレースを終了するアドレスを指定します。 EndAddress を使用しない場合は、単一の命令または関数呼び出しが実行されます。
Environment
モード |
ユーザー モード、カーネル モード |
Targets |
ライブデバッグのみ |
プラットフォーム |
ユーザー モード: すべて カーネル モード: x86 ベースのみ |
追加情報
wt コマンドの発行と関連コマンドの概要の詳細については、「ターゲットの制御」を参照してください。
解説
wt コマンドは、特定の関数の動作に関する情報が必要だが、関数をステップ実行したくない場合に便利です。 代わりに、その関数の先頭に移動して、wt コマンドを発行します。
プログラム カウンタがシンボルに対応するポイント (関数の先頭やモジュールへのエントリ ポイントなど) にある場合、wt コマンドは現在のリターン アドレスに到達するまでトレースします。 プログラム カウンタが call 命令にある場合、wt コマンドは現在の位置に戻るまでトレースします。 このトレースは、コマンドで発生したさまざまな呼び出しを説明する出力とともに、デバッガー コマンド ウィンドウでプロファイルされます。
wt コマンドが関数の先頭以外の場所で発行された場合、コマンドは p (ステップ) コマンドと同様に動作します。 ただし、EndAddress を指定すると、実行に多くのプログラム ステップや関数呼び出しが含まれる場合でも、そのアドレスに到達するまで実行が継続されます。
ソース モードでデバッグする場合は、関数本体の左括弧が表示される位置までのみ関数をトレースする必要があります。 その後、wt コマンドを使用できます。 (通常は、関数の最初の行にブレークポイントを挿入するか、[デバッグ] | [カーソルまで実行] を使用してから wt コマンドを使用する方が簡単です。)
wt からの出力は長くなる可能性があるため、ログ ファイルを使用して出力を記録することをお勧めします。
次の例は、一般的なログ ファイルを示しています。
0:000> l+ Source options set to show source lines
Source options are f:
1/t - Step/trace by source line
2/l - List source line for LN and prompt
4/s - List source code at prompt
8/o - Only show source code at prompt
0:000> p Not yet at the function call: use "p"
> 44: minorVariableOne = 12;
0:000> p
> 45: variableOne = myFunction(2, minorVariable);
0:000> t At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000 jmp MyModule!myFunction (0040f6e0)
0:000> t
> 231: {
0:000> wt At the function beginning: now use "wt"
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
112379 instructions were executed in 112378 events (0 from other threads)
Function Name Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp) 1 1 1 1
MyModule!ILT+1440(__isatty) 21 1 1 1
MyModule!ILT+1540(__ftbuf) 21 1 1 1
....
ntdll!memcpy 24 1 40 19
ntdll!memset 2 29 29 29
23 system calls were executed
Calls System Call
23 ntdll!KiFastSystemCall
トレースのリストでは、最初の数値は実行された命令の数を指定し、2 番目の数値は関数の子プロセスによって実行された命令の数を指定し、スタック (初期関数をゼロとします) で 3 番目の数値 (括弧内) は関数の深さを指定します。 関数名のインデントは呼び出しの深さを示します。
前述の例では、MyModule!myFunction は、printfや fgets などのいくつかのサブルーチンを呼び出す前に 105 の命令を実行し、これらの関数を呼び出した後、さらにいくつかの呼び出しを発行する前に、さらに 54545 の追加の命令を実行します。 ただし、最終的なカウントでは、myFunction が 112,379 個の命令を実行したことが表示されます。これは、このカウントには、myFunction とその子が実行される命令がすべて含まれているためです。 (myFunction の子は、myFunction から直接または間接的に呼び出される関数です。)
前述の例では、ILT+1440 (__isatty) が 21 回呼び出されていることにも注意してください。 最終的なカウントでは、この関数の動作の概要として、関数が呼び出された回数、1 回の実行での最小命令数、1 回の実行での最大命令数、および 1 回の実行あたりの平均命令数が示されます。
システム コールが実行されると、それらはカウンタに表示され、コマンド出力の最後に再度リストされます。