Windbg上的'dds esp'

时间:2017-10-06 16:23:08

标签: debugging windbg stack-pointer

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

因为有一些第三方扩展,它们在esp​​ / rsp输出上运行,并将条目串起来,看起来像一个调用堆栈,但我似乎无法将该顺序与我在source(好吧,无论我有什么来源。)甚至还有很久以前就已经返回的函数条目。

我错过了什么?

更新:

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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