【问题标题】:Getting the EBP of a thread in a different process在不同的进程中获取线程的 EBP
【发布时间】:2011-05-19 22:21:41
【问题描述】:

我想知道除了使用“GetThreadContext”之外,是否有办法在不同的进程(在 Windows 上的 C++ 中)中获取线程的 EBP。我怀疑这种方法花费了太多时间(我经常使用它),如果我能得到 EBP 而不是 CONTEXT 的所有值,它会更快。
我正在考虑使用“ReadProcessMemory”,然后将 EBP 与调用堆栈的其余部分一起获取,但我不知道堆栈应该在哪里以及从哪里获取它。
如果有人知道更好的方法,我很乐意听到。
谢谢:)

【问题讨论】:

  • 你在写什么,分析器?也许如果你解释你的问题,有人可以给你一个更快的方法。

标签: c++ windows callstack


【解决方案1】:

如果线程正在运行,则另一个线程的EBP 的运行值当然是在EBP 寄存器中。如果它没有运行,它会被内核中的调度程序保存下来。 GetThreadContext 正在检索内核中的内容;没有什么比这更快了。

性能情况比我写这篇文章时的理解还要糟糕。如果线程正在运行,内核使用 APC 机制为您获取最新值。这速度不快,但没有其他替代 API。

【讨论】:

  • 不,那是错误的。如果不是当前线程,NtGetContextThread 总是将 APC 排队到目标线程。然后它等待 APC 完成。不是很快。
  • 如果实际上有其他更快的替代方案,我会对此感到更糟。有吗?
  • 没有。如果一个线程正在运行,它的寄存器是......在寄存器中,这不是很有帮助。如果它没有运行,寄存器将保存在它的 KTHREAD 对象中。因此,确保线程的寄存器被保存以便我们可以实际读取它们的最佳方法是将 APC 排队到它,从而在该线程的处理器上造成中断。
【解决方案2】:

GetThreadContext 将是唯一的方法,因为 EBP 是一个寄存器;处理器在进行上下文切换时将其保存起来。读取线程寄存器的唯一方法是使用 GetThreadContext。

当然,不能保证 EBP 中包含您想要的值...编译时省略帧指针的函数不会可靠地将 EBP 设置为当前调用帧的帧指针。

如果您只是在寻找堆栈跟踪(需要 EBP 开始的最常见原因),我可以建议 StackWalk64 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2010-12-30
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多