【问题标题】:'dds esp' on WindbgWindbg 上的“dds esp”
【发布时间】:2017-10-06 16:23:07
【问题描述】:

我不确定我是否正确理解 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

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

【问题讨论】:

    标签: debugging windbg stack-pointer


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢托马斯。我想这意味着列出 esp/rsp 并不是线程是否最终执行特定函数的可靠指标? (即使用一些看起来像函数地址的符号名称。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多