目前,我使用dbghelp库遍历某个进程线程的堆栈(使用GetThreadContext()和StackWalk64()),并仅收集每个帧包含的返回地址。

但是,这样做的开销对于系统需求来说太大了-总时间约为apx。每堆栈步行5毫秒(10-15帧)。这次包括GetThreadContext()和调用StackWalk64()来获取所有帧的循环。

无论如何,我必须找到一种更快的方法。有人知道我该怎么做吗?

编辑:

有人知道ETW(Windows事件跟踪)机制吗?

如果是这样,我如何跟踪在一段时间内发生的所有上下文切换?
是否有一个事件提供程序在每个上下文切换上发布事件?

最佳答案

我能想到的最快的方法是通过创建一个内核驱动程序来创建自己的GetThreadContextStackWalk64版本,该内核驱动程序将捕获您尝试监视的线程的kernelStack结构的ETHREAD字段。 Here是关于此主题的好文章。

08-27 20:00