我在想,除了使用“GetThreadContext”之外,是否还有一种方法可以在不同的进程(Windows上的C ++)中获得线程的EBP。 我怀疑这个方法花了太多时间(我用了很多),如果我能得到EBP而不是所有CONTEXT的值,那就更快了。
我正在考虑使用“ReadProcessMemory”,然后获得EBP与其余的调用堆栈,但我不在堆栈应该在哪里,我应该从哪里得到它。
如果有人知道更好的方法,我很乐意听到。
谢谢 :)
如果线程正在运行,另一个线程的EBP的运行值当然是在EBP寄存器中。 如果没有运行,它会被内核中的调度程序保存。 GetThreadContext正在检索内核中的内容; 没有别的会更快。
表现情况比我在写这篇文章时所理解的要糟糕。 如果线程正在运行,内核将使用APC机制为您获取最新的值。 这不是很快,但没有其他的替代API。
GetThreadContext将是唯一的方法,因为EBP是一个注册表; 处理器在执行上下文切换时将其保存起来。 读取线程寄存器的唯一方法是使用GetThreadContext。
当然,不能保证EBP具有你想要的值…使用帧指针省略编译的函数不能可靠地将EBP设置为当前调用帧的帧指针。
如果你只是在寻找一个堆栈跟踪(最常见的原因是想要一个EBP开始),我可以建议StackWalk64 ?