2017-10-06 63 views
1

我不确定我是否正确理解dds esp或其64位对应部分dqs rsp的原始输出。当我看到堆栈中的条目列表时,我倾向于认为,无论我看到返回地址的哪个位置,都是尚未返回的代码调用。 IOW,将它们串在一起应该形成一个很好的调用堆栈。 (现在让我们不用为k*一组Windbg命令而烦恼。)情况并非总是如此吗?Windbg上的'dds esp'

由于存在一些第三方扩展,它对esp/rsp输出进行操作,并将条目串起来看起来像一个调用堆栈,但似乎无法与我看到的顺序相匹配来源(呃,无论我有什么资料来源)。甚至还有很久以前返回的函数。

我缺少什么?

UPDATE:

行 - 我使用第三方扩展并说:

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

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

回答

2

dds装置d UMP d字(32位)和解释结果作为小号 ymbol。类似于dqs(四字,64位)和dps(指针大小,与架构匹配)。

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

这些局部变量可能不会像对抗和ij也许floatdouble数据类型的变量,这是很难预测他们如何看起来像在内存中。此外,struct可能会有一个布局,导致内存中的表示看起来像一个符号。

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

尽管您需要对应用程序的功能有很好的理解,即哪些符号可以位于调用堆栈中,哪些符号不在此处,但仍然可以在dps的堆栈损坏情况下使用。

+0

谢谢托马斯。我想这意味着列出esp/rsp并不是线程是否执行特定函数的可靠指示器? (即通过某些符号名称来寻找__函数地址)。 – ForeverLearning