多处理器语法
KD 和内核模式 WinDbg 支持多处理器调试。 可以在任何多处理器平台上执行此类调试。
处理器编号为零到 n。
如果当前处理器是处理器 0 (也就是说,如果处理器当前导致调试器) 处于活动状态,则可以检查其他非当前处理器 (处理器 1 到 n) 。 但是,不能更改非当前处理器中的任何内容。 只能查看其状态。
选择处理器
可以使用 .echocpunum (显示 CPU 编号) 命令显示当前处理器的处理器编号。 此命令的输出使你能够立即通过内核调试提示中的文本在多处理器系统上工作。
在以下示例中,kd> 提示符前面的 0: 表示正在调试计算机中的第一个处理器。
0: kd>
使用 ~s (更改当前处理器) 命令在处理器之间切换,如以下示例所示。
0: kd> ~1s
1: kd>
现在,你正在调试计算机中的第二个处理器。
如果遇到中断且无法理解堆栈跟踪,则可能需要更改多处理器系统上的处理器。 中断可能发生在其他处理器上。
在其他命令中指定处理器
可以在多个命令之前添加处理器编号。 此数字前面没有波形符 (~) , 但 ~S 命令中除外。
注意 在用户模式调试中,波形符用于指定线程。 有关此语法的详细信息,请参阅 线程语法。
处理器 ID 不必显式引用。 相反,可以使用解析为对应于处理器 ID 的整数的数值表达式。 若要指示应将表达式解释为处理器,请使用以下语法。
||[Expression]
在此语法中,需要方括号, Expression 代表解析为对应于处理器 ID 的整数的任何数值表达式。
在以下示例中,处理器根据用户定义的伪寄存器的值而更改。
||[@$t0]
示例
以下示例使用 k (显示堆栈回溯) 命令显示处理器 2 中的堆栈跟踪。
1: kd> 2k
以下示例使用 r (Registers) 命令显示处理器 3 的 eax 寄存器。
1: kd> 3r eax
但是,以下命令会提供语法错误,因为不能更改当前处理器以外的处理器的状态。
1: kd> 3r eax=808080
断点
在内核调试期间, bp、bu、bm (Set Breakpoint) 和 ba (Break on Access) 命令适用于多处理器计算机的所有处理器。
例如,如果当前处理器为 3,则可以输入以下命令在 SomeAddress 处放置断点。
1: kd> bp SomeAddress
然后,任何处理器 (不仅处理器一个在该地址处执行的) 会导致断点陷阱。
显示处理器信息
可以使用 !running 扩展来显示目标计算机上每个处理器的状态。 对于每个处理器, !running 还可以显示进程控制块中的当前和下一个线程字段 (PRCB) 、16 个内置排队的旋转锁的状态以及堆栈跟踪。