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