我不确定我是否正确理解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
那么,问题就变成 那个条目了?我以为是某个函数的返回地址正在修复以调用另一个函数?
答案 0 :(得分:2)
dds
表示 d ump d 字(32位),并将结果解释为 s ymbol。类似于dqs
(四字,64位)和dps
(指针大小,与架构匹配)。
如果您再次阅读,您会发现 symbol 这个词的缩写,而不是 stack 。如果可能,恰好在内存中的任何数字都将被解释为符号。这可能是堆栈上的方法调用。它也可能是一个局部变量,意外地具有与符号匹配的值。
那些局部变量可能不是i
和j
等计数器变量,但可能是float
或double
数据类型,很难预测它们在内存中的样子。此外,struct
可能有一个布局,导致内存中的表示看起来像一个符号。
你提到的扩展名似乎做了一个简单的dps
和过滤行没有关联的符号。
尽管如此,dps
在堆栈损坏的情况下仍然有用,尽管您需要很好地理解应用程序的功能,即哪些符号可以在调用堆栈上,哪些符号不在那里。