【问题标题】:Callstack address调用栈地址
【发布时间】:2011-04-17 02:49:45
【问题描述】:

有人知道我是否/如何从特定地址的调用堆栈中读取数据吗? 假设我从调用栈的基地址有一个偏移地址,我怎样才能得到基地址?

谢谢:)

【问题讨论】:

    标签: c++ windows callstack


    【解决方案1】:

    堆栈的基地址在 Windows x86 架构上的寄存器 ESP 中。您可以在 VS 调试器的 'Registers' 窗口中查看 ESP

    【讨论】:

    • 那么,如果我有某个方法的帧指针的相对地址(由 StackWalk64 返回),我需要做的就是添加相对于 ESP 的绝对地址?
    • 在 x86 中,堆栈从更高的内存增长到更低的内存。所以从 EBP 你实际上必须减去 /(或者你必须从 ESP 中减去)
    【解决方案2】:

    这在很大程度上取决于运行可执行文件的平台 ABI。我建议使用您所选择的平台所接受的反汇编工具之一,这些工具通常可以帮助获取此类信息。例如,IDA Pro 适用于 Windows 和 Linux。

    【讨论】:

    • @Idov:你仍然应该使用反汇编工具来查看你感兴趣的偏移量。我怀疑你会在这里得到一个食谱解决方案
    • 我正在使用 StackWalk64 来获取偏移量。 :)
    【解决方案3】:

    在 Windows 中,您有一个 API 来遍历完整的调用堆栈:

    请参阅codeproject.com 中的此示例

    【讨论】:

    • 我知道,但我需要帧指针的绝对地址。 :)
    • 抱歉,我没有 Windows 框可以立即试用,但 ADDRESS64 中的 Offset 参数不正是为 AddrFrame 返回的您想要的吗?除非您使用旧的内存模型,否则这将直接是帧指针的绝对位置。我错了吗? :)
    • 感谢 Idov,恐怕我现在可以测试它......但是文档的这一位让我感到困惑“段中的偏移量,或 32 位虚拟地址。解释此值取决于 Mode 成员中包含的值。” [msdn.microsoft.com/en-us/library/ms679272],所以即使它调用了 Offset,它看起来也包含真实的完整地址。不是这样吗?提前致谢。
    • 我不知道...我尝试使用“ReadProcessMemory”从其他进程读取堆栈,但它没有返回正确的值...
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多