Debugging Tools for Windows

z (Execute While)

z 命令当给定条件为真时执行一条命令。

语法

用户模式

Command ; z( Expression ) 

内核模式

Command ; [Processorz( Expression ) 

参数

Command
指定当Expression 的值为非0时要执行的命令。该命令总是至少会被执行一次。
Processor
指定要应用该条件测试的处理器。该语法的更多信息,查看多处理器语法。只有内核模式下可以制定处理器。
Expression
指定要测试的条件。如果该条件是非0值,Command 命令会再一次执行并且再次测试Expression 的值。该语法的更多信息,查看数值表达式语法

环境

模式 用户模式、内核模式
目标 活动目标,崩溃转储
平台 所有

注释

在很多调试器命令中,分号用来分隔多个不相关的命令。但是,在z命令中,分号用来将"z"和Command 参数分开。

Command 命令总是至少执行一次,然后测试Expression 。如果条件为非0值,该命令再次执行,并且再次测试Expression 。(这个特性和C语言的do - while 循环相似,而不像while 循环。)

如果"z"左边有多个分号,当Expression 条件为真时"z"左边的所有命令都会被执行。它们可以是任何允许用分号结尾的调试器命令。

如果在z命令之后还添加了另外的分号和命令,这些命令在循环完成之后执行。一般不建议使用以"z"开头的行,某些其它动作,这样会产生奇怪的输出。注意z命令可以嵌套。

要中断太长的循环,可以在CDB或KD中使用CTRL+C或者在WinDbg中使用Debug | BreakCTRL+BREAK

下面是一个使用不必要的复杂方式来清空eax寄存器的示例。

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

下面的命令将eaxebx加1,直到它们中的一个大于8,然后将ecx递增一次。

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 )

参见

j (Execute If-Else)

Build machine: CAPEBUILD