ETW 事件跟踪:排查 OpenTrace/ProcessTrace 不返回事件
2024-03-03 08:01:48
ETW 事件跟踪:当 OpenTrace/ProcessTrace 不返回事件时
问题
尽管成功执行,OpenTrace
和 ProcessTrace
却不返回任何事件,这是怎么回事?
步骤 1:验证文件完整性
首先,确保 .etl
文件有效且包含事件。使用 Windows Performance Analyzer、PerfView 或 tracerpt
等工具打开它来验证其完整性。
步骤 2:检查函数调用
仔细检查代码,以确保正确调用了 OpenTrace
和 ProcessTrace
。验证 EVENT_TRACE_LOGFILEW
结构是否正确初始化,包括 LogFileName
和 EventCallback
字段。
步骤 3:调试事件回调
在 EVENT_CALLBACK
函数中设置一个断点,以验证它是否被调用。运行代码时,检查断点是否被命中。如果没有,可能存在回调注册或执行问题。
步骤 4:检查 ProcessTraceMode
默认情况下,ProcessTrace
使用传统的 EVENT_CALLBACK
回调。要使用较新的 EVENT_RECORD_CALLBACK
回调,请在 EVENT_TRACE_LOGFILEW
结构中将 ProcessTraceMode
设置为 PROCESS_TRACE_MODE_EVENT_RECORD
。
步骤 5:考虑 BufferCallback
如果你使用了 BufferCallback
,请确保它返回 TRUE
以继续处理事件。否则,ProcessTrace
将停止处理。
步骤 6:检查错误
查看 OpenTrace
和 ProcessTrace
的返回值。如果它们返回错误代码,请使用 GetLastError
检索详细的错误信息。
步骤 7:检查线程和进程标识符
查看 EVENT_TRACE_HEADER
结构中的 ThreadId
和 ProcessId
值。确保回调已为正确的线程和进程注册。
步骤 8:禁用防病毒软件
某些防病毒软件会干扰 ETW 跟踪。暂时禁用它以查看它是否影响了行为。
结论:
排除了这些可能的原因后,你应该能够诊断出 OpenTrace
和 ProcessTrace
不返回事件的原因。了解这些故障排除步骤将帮助你解决与 ETW 事件跟踪相关的未来问题。
常见问题解答:
-
OpenTrace
和ProcessTrace
之间的区别是什么?OpenTrace
仅打开一个.etl
文件,而ProcessTrace
会处理文件中的事件。 -
如何使用
BufferCallback
?BufferCallback
用于自定义缓冲区分配和管理。有关详细信息,请参阅 Microsoft 文档。 -
我收到“访问被拒绝”的错误。怎么回事?
确保你拥有读取
.etl
文件所需的权限,并以管理员身份运行代码。 -
ETW 事件跟踪中哪些设置会影响性能?
缓冲区大小、事件级别和跟踪模式都会影响性能。根据你的具体需求进行调整。
-
我可以使用 ETW 跟踪什么?
ETW 可用于跟踪系统性能、应用程序行为和内核活动。