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

在不同的进程中获取线程的EBP 我想知道是否有一种方法可以在不同的进程中获得一个线程的EBP(在Windows上的C++中),而不是使用“GETTHealEngress”。我怀疑这个方法花费了太多时间(我经常使用),如果我只得到EBP而不是上下文的所有值,它会更快。 我曾考虑使用“ReadProcessMemory”,然后用调用堆栈的其余部分获取EBP,但我不知道堆栈应该在哪里,从哪里获取它。 如果有人知道更好的方法,我很乐意听到。 谢谢:),c++,windows,callstack,C++,Windows,Callstack,当然,如果线程正在运行,则另一个线程的EBP运行值在EBP寄存器中。如果它没有运行,它将由内核中的调度程序保存。GetThreadContext正在检索内核中的内容;没有比这更快的了 性能情况比我写这篇文章时理解的还要糟糕。如果线程正在运行,内核将使用APC机制为您获取最新值。这不是很快,但没有其他替代API。当然,如果线程正在运行,则另一个线程的EBP的运行值在EBP寄存器中。如果它没有运行,它将由内核中的调度程序保存。GetThreadContext正在检索内核中的内容;没有比这更快的了 性

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


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

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


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

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

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


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

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

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


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

不,这是错误的。NtGetContextThread始终将APC排队到目标线程(如果它不是当前线程)。然后等待APC完成。不是很快。事实上,如果有其他更快的选择,我会感觉更糟。有吗?没有。如果线程正在运行,它的寄存器是。。。在寄存器中,这不是很有帮助。如果它没有运行,寄存器将保存在它的KTHREAD对象中。因此,确保线程的寄存器被保存以便我们能够真正读取它们的最佳方法是将APC排队,从而在该线程的处理器上造成中断。不,这是错误的。NtGetContextThread始终将APC排队到目标线程(如果它不是当前线程)。然后等待APC完成。不是很快。事实上,如果有其他更快的选择,我会感觉更糟。有吗?没有。如果线程正在运行,它的寄存器是。。。在寄存器中,这不是很有帮助。如果它没有运行,寄存器将保存在它的KTHREAD对象中。因此,确保线程的寄存器被保存以便我们能够真正读取它们的最好方法是将APC排队,从而在该线程的处理器上造成中断。你在写什么,探查器?也许如果你解释你的问题,有人可以给你一个更快的方法。你在写什么,一个剖析器?也许如果你解释你的问题,有人可以给你一个更快的方法。