z(执行 While)

z 命令在给定条件为 true 时执行命令。

用户模式

Command ; z( Expression ) 

内核模式

Command ; [Processor] z( Expression )

参数

命令
指定要在表达式条件计算为非零值时执行的命令。 此命令始终至少执行一次。

处理器
指定适用于测试的处理器。 有关语法的详细信息,请参阅 多处理器语法。 只能在内核模式下指定处理器。

表达
指定要测试的条件。 如果此条件的计算结果为非零值,则 再次执行 Command 命令,然后 再次测试表达式 。 有关语法的详细信息,请参阅数字表达式语法

环境

说明
模式 用户模式、内核模式
目标 实时、崩溃转储
平台 全部

注解

在许多调试器命令中,分号用于分隔不相关的命令。 但是,在 z 命令中,分号将“z”与 Command 参数分隔开来。

命令始终至少执行一次,然后测试表达式。 如果条件为非零值,则再次执行该命令,然后 再次测试表达式 。 (此行为类似于 C 语言 do - while 循环,而不是简单的 while 循环。

如果“z”左侧有多个分号,只要表达式条件为 true,“z”左侧的所有命令都会重复。 此类命令可以是允许终端分号的任何调试器命令。

如果在 z 命令后添加另一个分号和附加命令,这些附加命令会在循环完成后执行。 我们通常不建议使用以“z”开头的行,因为它会永远生成不感兴趣的输出,除非条件由于其他一些操作而变为 false。 请注意,可以嵌套 z 命令。

若要中断持续太久的循环,请在 CDB 或 KD 中使用 CTRL+C,或使用调试 |从菜单中中断,或 WinDbg 中的 Ctrl+BREAK。

下面的代码示例演示了一种不必要的复杂方法,用于零 eax 寄存器。

0:000> reax = eax - 1 ; z(eax)

以下示例递增 eaxebx 寄存器,直到其中一个寄存器至少为 8,然后递增 ecx 寄存器一次。

0:000> reax=eax+1; rebx=ebx+1; z((eax<8)|(ebx<8)); recx=ecx+1

以下示例使用C++表达式语法,并使用伪寄存器 $t 0 作为循环变量。

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 )

另请参阅

j (执行 If-Else)