我正在尝试使用 Windbg 在 Windows XP 中自动执行设备驱动程序的调试 session 。我的设备有一个“索引”寄存器和一个“数据”寄存器,两者都是内存映射的。索引寄存器必须填入内部寄存器的索引,可以从数据寄存器中读取值。
因此,以下 Windbg 命令正确打印了内部寄存器 0x​​4C 的值:

!ed [uc] 0xfa000000 0x4c; !dd [uc] 0xfa000004 L1

现在我想转储一系列内部寄存器,但似乎别名扩展在 !ed 命令中没有按预期工作。我正在尝试这个循环:
.for (r $t0=0; @$t0<0x100; r $t0=@$t0+1) { !ed [uc] 0xfa000000 @$t0; !dd [uc] 0xfa000004 L1  }

但似乎 !ed 命令被忽略了,就好像 @$t0 被扩展为一个空字符串一样。
尝试了“$t0”、“@$t0”、“${t0}”和“@${t0}”,但没有成功。我究竟做错了什么?

最佳答案

是的,似乎 !ed 不像其他命令那样评估它的参数。您需要事先评估它们,例如使用别名,如下所示:

.for (r $t0=0; @$t0<0x100; r $t0=@$t0+1) { as /x val @$t0 ; .block {!ed [uc] 0xfa000000 ${val} ; !dd [uc] 0xfa000004 L1 } }

关于Windbg 伪寄存器扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2689741/

10-12 20:36