'dds esp' 在 Windbg 上

'dds esp' on Windbg

我不确定我是否正确理解 dds esp 或其 64 位副本 dqs rsp 的原始输出。当我看到堆栈中的条目列表时,我倾向于假设无论我在哪里看到 return 地址,这些都是由 尚未 return 编辑的代码进行的调用 . IOW,将它们串在一起应该形成一个很好的调用堆栈。 (我们暂时不用理会 k* 组 Windbg 命令。)情况不总是这样吗?

因为有一些第三方扩展,它们对 esp/rsp 输出进行操作,并将条目串在一起,形成看起来像调用堆栈的东西,但我似乎无法将该顺序与什么相匹配我在源代码中看到(好吧,无论我有什么源代码。)甚至还有很久以前 returned 的函数条目。

我错过了什么?

更新:

好的——我使用的第三方扩展确实说:

Dumps (dps) from the stack limit the base only showing items that include the ! followed by +0x

那么,问题就变成了那个条目?我以为是某个函数的 return 地址正在修复以调用另一个函数?

dds 表示 dump dwords(32 位)并将结果解释为 s符号。类似于 dqs(四字,64 位)和 dps(指针大小,匹配架构)。

如果你再读一遍,你会发现术语 symbol 是缩写,而不是 stack。如果可能,任何恰好在内存中的数字都将被解释为一个符号。那可能是堆栈上的方法调用。它也可能是一个局部变量,它意外地具有与符号匹配的值。

这些局部变量可能不是像ij这样的计数器变量,但可能是floatdouble数据类型,很难预测它们的样子在记忆中。此外,structs 的布局可能会导致内存中的表示形式看起来像一个符号。

你提到的扩展似乎做了一个简单的 dps 和过滤没有关联符号的行。

尽管如此,dps 在堆栈损坏的情况下还是有帮助的,尽管您需要很好地了解您的应用程序的作用,即哪些符号可以在调用堆栈上,哪些符号不能在那里。