Debugging Tools for Windows |
KD 和内核模式 WinDbg 支持多处理器调试。可以在任何多处理器平台实现。
处理器从 0 到 n 编号。
如果当前处理器是处理器 0(也就是说,当前导致调试器激活的是处理器 0),你可以查看其它非当前处理器(处理器 1 到 n)。然而,你不能修改非当前处理器上的任何事情 , 只能查看它们的状态。
你可以使用.echocpunum (Show CPU Number)命令显示当前处理器的序号。当你正处在多处理器系统上时通过内核调试提示符的形式马上表现出来。
下面的例子中,kd>提示符前的0:表示正在调试目标机的第一个处理器。
使用~s (Change Current Processor)命令在处理器之间切换。
1: kd>
现在变成调试电脑上的第二个处理器。
在一个多处理器系统上,如果你遇到断点而且堆栈回溯杂乱无章,有可能该断点发生在不同的处理器上。
许多命令都可以带一个处理器序号前缀。该序号前面不需要跟波形符(~),~S 命令除外。
注解 在用户模式调试下,颚化符号常用来指定线程。详细请看线程语法。
下例使用k (Display Stack Backtrace)命令显示处理器 2 上的堆栈回溯。
下例使用r (Registers) 命令显示处理器 3 上的 eax 寄存器:
但是,下面的命令会引起语法错误,因为不允许改变当前激活处理器以外的处理器状态:
内核调试过程中,bp, bu, bm (Set Breakpoint)和 ba (Break on Access)命令会影响多处理器电脑上的所有处理器。
例如,如果当前有 3 个处理器,可以通过下面的命令在SomeAddress 设置断点。
任何处理器(不单是处理器 1)执行到该地址都将引起断点陷阱(breakpoint trap)。
!running扩展命令可用来显示目标计算机上各个处理器的状态。对每个处理器,!running 也可以显示进程控制块(PRCB)中的当前和下一个线程域,16 个内建 spinlocks 队列,以及堆栈回溯。