目前,我使用dbghelp库遍历某个进程线程的堆栈(使用GetThreadContext()和StackWalk64()),并仅收集每个帧包含的返回地址。
但是,这样做的开销对于系统需求来说太大了-总时间约为apx。每堆栈步行5毫秒(10-15帧)。这次包括GetThreadContext()和调用StackWalk64()来获取所有帧的循环。
无论如何,我必须找到一种更快的方法。有人知道我该怎么做吗?
编辑:
有人知道ETW(Windows事件跟踪)机制吗?
如果是这样,我如何跟踪在一段时间内发生的所有上下文切换?
是否有一个事件提供程序在每个上下文切换上发布事件?
最佳答案
我能想到的最快的方法是通过创建一个内核驱动程序来创建自己的GetThreadContext
和StackWalk64
版本,该内核驱动程序将捕获您尝试监视的线程的kernelStack
结构的ETHREAD
字段。 Here是关于此主题的好文章。