z (While の実行)
zコマンドは、指定された条件が true の間コマンドを実行します。
ユーザー モード
Command ; z( Expression )
カーネル モード
Command ; [Processor] z( Expression )
パラメーター
Command
Expression 条件がゼロ以外の値に評価される間に実行するコマンドを指定します。 このコマンドは常に少なくとも 1 回実行されます。
Processor
テストに適用するプロセッサを指定します。 構文の詳細については、「システム構文」を参照してください。 プロセッサは、カーネルモードでのみ指定できます。
Expression
テストする条件を指定します。 この条件がゼロ以外の値に評価された場合、Command コマンドが再度実行され、Expression が再度テストされます。 構文の詳細については 数値式の構文」を参照してください。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
解説
多くのデバッガー コマンドでは、関連のないコマンドを区切るためにセミコロンが使用されます。 ただし、z コマンドでは、セミコロンで「z」とコマンド パラメーターが区切られます。
Command コマンドは常に少なくとも 1 回実行され、その後 Expression がテストされます。 この条件がゼロ以外の値に評価された場合、Command コマンドが再度実行され、Expression が再度テストされます。 (この動作は、単純な while ループではなく、C 言語の do - while ループに似ています。)
「z」の左側にいくつかのセミコロンがある場合、Expression の条件が true である限り、「z」の左側にあるすべてのコマンドが繰り返されます。 このようなコマンドには、終端セミコロンを許可する任意のデバッガー コマンドを使用できます。
「z」の左側にいくつかのセミコロンがある場合、式の条件が true である限り、「z」の左側にあるすべてのコマンドが繰り返されます。 通常、「z」で始まる行は推奨しません。他のアクションによって条件が false にならない限り、興味のない出力が永久に生成されるからです。 z コマンドをネストできることに注意してください。
長すぎるループを中断するには、CDB または KD で Ctrl + C キーを押すか、メニューから [デバッグ] | [中断] を使用するか、WinDbg で Ctrl + BREAK キーを押します。
次のコード例は、eax レジスタをゼロにする不必要に複雑な方法を示しています。
0:000> reax = eax - 1 ; z(eax)
次の例では、eax レジスタと ebx レジスタのいずれかが 8 以上になるまでインクリメントし、その後 ecx レジスタを 1 回インクリメントします。
0:000> reax=eax+1; rebx=ebx+1; z((eax<8)|(ebx<8)); recx=ecx+1
次の例では、C++ 式構文を使用し、疑似レジスタ $t0 をループ変数として使用します。
0:000> .expr /s c++
Current expression evaluator: C++ - C++ source expressions
0:000> db pindexcreate[@$t0].szKey; r$t0=@t0+1; z( @$t0 < cIndexCreate )