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)
以下示例递增 eax 和 ebx 寄存器,直到其中一个寄存器至少为 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 )