KD 和内核模式 WinDbg 支持多个处理器调试。 可以在任何多处理器平台上执行此类调试。
处理器编号为零到 n。
如果当前处理器是处理器 0(即,如果它是当前导致调试器处于活动状态的处理器),则可以检查其他非当前处理器(处理器一到 n)。 但是,不能更改非当前处理器中的任何内容。 只能查看其状态。
选择处理器
可以使用 .echocpunum (显示 CPU 编号) 命令显示当前处理器的处理器编号。 通过此命令的输出,你可以通过内核调试提示中的文本立即判断何时处理多个处理器系统。
在以下示例中, 0: 在 kd> 提示符前指示正在调试计算机中的第一个处理器。
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
然后,在该地址执行的任何处理器(而不仅仅是处理器 1)都会导致断点陷阱。
显示处理器信息
可以使用 !running 扩展显示目标计算机上的每个处理器的状态。 对于每个处理器,!running 还可以显示进程控制块(PRCB)中的当前和下一个线程字段、16 个内置排队旋转锁的状态,以及堆栈跟踪。