z(执行 While)
z 命令在给定条件为 true 时执行命令。
User-Mode
Command ; z( Expression )
Kernel-Mode
Command ; [Processor] z( Expression )
参数
命令
指定要在 表达式 条件的计算结果为非零值时执行的命令。 此命令始终至少执行一次。
处理器
指定应用于测试的处理器。 有关语法的详细信息,请参阅 多处理器语法。 只能在内核模式下指定处理器。
表达
指定要测试的条件。 如果此条件的计算结果为非零值,则 再次执行 Command 命令,然后再次测试 Expression 。 有关语法的详细信息,请参阅 数值表达式语法。
环境
项 | 说明 |
---|---|
模式 | 用户模式、内核模式 |
目标 | 实时、故障转储 |
平台 | 全部 |
注解
在许多调试器命令中,分号用于分隔不相关的命令。 但是,在 z 命令中,分号将“z”与 Command 参数分隔开。
始终至少执行一次 Command 命令,然后测试 Expression 。 如果条件为非零值,则再次执行命令,然后再次测试 Expression 。 (此行为类似于 C 语言 do - while 循环,而不是简单的 while 循环。)
如果“z”左侧有多个分号,则只要 Expression 条件为 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 )
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈