2010-12-03 62 views
1

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

+1

你在写什么,一个分析器?也许如果你解释你的问题,有人可以给你一个更快的方式。 – 2010-12-04 23:55:50

+0

是的,一个分析器:) – Idov 2010-12-05 06:53:00

回答

3

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

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

1

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

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

如果您只是在寻找堆栈跟踪(最常见的原因希望EBP开始),我可能会建议StackWalk64

相关问题