【发布时间】:2021-06-23 03:43:23
【问题描述】:
我正在使用 Windbg Preview 来调试一个通用程序。我正在使用kd command 转储堆栈,
但我发现它不会仅从 esp 向下打印相应的内存,
由于r 命令显示 esp 指向 0x29af810 ,kd 只是向我显示了 0x29af814 及更高版本的内存,我认为单步执行一条指令会使其自行纠正,但它似乎保持不变。是否是 Windbg Preview 的已知 bug?
即使在第一次休息时,它似乎也会产生错误的答案。
(3f44.87c): Break instruction exception - code 80000003 (first
chance)
eax=00000000 ebx=00000000 ecx=189c0000 edx=00000000 esi=77d52054
edi=77d5261c
eip=77df1ba2 esp=005bf984 ebp=005bf9b0 iopl=0 nv up ei pl zr
na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b
efl=00000246
ntdll!LdrpDoDebuggerBreak+0x2b:
77df1ba2 cc int 3
0:000> kd 10
005bf9b0 005bfc10
005bf9b4 77dec0a8 ntdll!LdrpInitializeProcess+0x1c98
005bf9b8 c12453e3
005bf9bc 0286d000
005bf9c0 00000000
005bf9c4 02870000
005bf9c8 00640062
005bf9cc 02af2738
005bf9d0 005bfb44
005bf9d4 00000000
005bf9d8 00000201
005bf9dc 00000000
005bf9e0 005bfb40
005bf9e4 00000000
005bf9e8 02af4198
005bf9ec 77e65d00 ntdll!LdrpWorkQueue
【问题讨论】:
-
对不起,我是新来的,不熟悉如何发布内容,我只是在我的 sdk 中启动了旧版本的 windbg,它确实支持
kd,但它的行为仍然不正确,我参考了手册,它告诉我:“kd 命令相当于使用堆栈地址作为参数的 dds(显示内存)命令。”当我按照一些说明进行操作时,似乎kd确实从 ebp 而不是 esp 转储堆栈,并按照 esp 的更改来更改视图,但我不太确定。 -
是的,执行正确,但这意味着我需要输入
dps esp L4,比kd 4花费相当大的成本(如果可以正确打印),我也想知道为什么会导致这样的奇怪的结果。关于起始地址,其实我在Windbg Preview中尝试了vs2019构建的一些不同的exe,并观察到在第一个断点(LdrpDoDebuggerBreak)使用kd时,它们的所有打印都是从ebp开始的,似乎@987654334 @ 即使调试器第一次闯入被调试者,也会产生错误的答案。 -
但是更远的调试让我感到困惑,因为我组装了两个语句来观察
kd输出的变化,发现它在没有任何信号的情况下发生变化