指定した状態になるまで実行する
指定した状態になるまでターゲットを実行させるには、いくつかの方法があります。
実行を制御するためのブレークポイントの使用
方法の 1 つに、ブレークポイントの使用があります。 最も単純なブレークポイントは、プログラム カウンターが指定したアドレスに達すると実行を停止します。 ブレークポイントが複雑になれば、次のことができます。
このアドレスが特定のスレッドによって実行された場合にのみトリガーできる。
指定した回数までこのアドレスの通過を許可してからトリガーできる。
指定したコマンドがトリガーされたときに自動的に発行できる。
実行可能でないメモリ内の指定されたアドレスを監視して、メモリの読み取り時または書き込み時にトリガーできる。
ブレークポイントの設定方法および制御方法の詳細については、「ブレークポイントの使用」を参照してください。
指定した状態になるまで実行する複雑な方法として、条件付きブレークポイントの使用があります。 この種類のブレークポイントは特定のアドレスに設定しますが、指定された条件が維持されている場合にのみトリガーされます。 詳細については、「条件付きブレークポイントの設定」を参照してください。
ブレークポイントと擬似レジスタ
目的の状態を指定する多くの場合、自動擬似レジスタを使用すると便利です。 これらはデバッガーによって制御される変数であり、ターゲットの状態に関連するさまざまな値を参照できます。
たとえば、次のブレークポイントでは、現在のスレッドの値と必ず等しくなる $thread 擬似レジスタを使用しています。 コマンドで使用すると、現在のスレッドの値になって解決されます。 bp (ブレークポイントの設定) コマンドの /t パラメーターの引数として $thread を使用すると、bp コマンドを発行した時点でアクティブだったスレッドで NtOpenFile が呼び出されるたびにトリガーされるブレークポイントを作成できます。
kd> bp /t @$thread nt!ntopenfile
他のスレッドが NtOpenFile を呼び出した場合、このブレークポイントはトリガーされません。
自動擬似レジスタの一覧については、「擬似レジスタの構文」を参照してください。
実行を制御するためのスクリプト ファイルの使用
指定された状態になるまで実行するもう 1 つの方法として、再帰的にそれ自体を呼び出すスクリプト ファイルを作成し、各反復処理で目的の状態をテストする方法があります。
通常、このスクリプト ファイルには .if トークンと .else トークンが含まれています。 t (トレース) などのコマンドを使用し、1 つのステップを実行してから対象の条件をテストできます。
たとえば、eax レジスタに値 0x1234 が格納されるまで実行する場合、次の行を含んだ eaxstep というスクリプト ファイルを作成できます。
.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }
次に、デバッガー コマンド ウィンドウから次のコマンドを発行します。
t "$<eaxstep"
この t コマンドは 1 つのステップを実行してから、引用符で囲まれたコマンドを実行します。 このコマンドは、$< (スクリプト ファイルの実行) となり、eaxstep ファイルを実行します。 このスクリプト ファイルは eax の値をテストし、t コマンドを実行してから、それ自体を再帰的に呼び出します。 これは eax レジスタが 0x1234 になるまで継続され、その値に達すると .echo (コメントのエコー) コマンドでデバッガー コマンド ウィンドウにメッセージが出力され、実行が停止します。
スクリプト ファイルの詳細については、「スクリプト ファイルの使用」および「デバッガー コマンド プログラムの使用」を参照してください。
あいまいなブレークポイントの解決
デバッガー エンジンのバージョン 10.0.25310.1001 以降では、あいまいなブレークポイント解決がサポートされるようになりました。 あいまいなブレークポイントにより、ブレークポイント式が複数の場所に解決される特定のシナリオで、デバッガーがブレークポイントを設定できます。 詳細については、「あいまいなブレークポイントの解決」を参照してください。