1

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

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

我错过了什么?

更新:

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

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

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

4

1 回答 1

2

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

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

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

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

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

于 2017-10-06T19:01:56.153 回答