返回

ETW 事件跟踪:排查 OpenTrace/ProcessTrace 不返回事件

windows

ETW 事件跟踪:当 OpenTrace/ProcessTrace 不返回事件时

问题

尽管成功执行,OpenTraceProcessTrace 却不返回任何事件,这是怎么回事?

步骤 1:验证文件完整性

首先,确保 .etl 文件有效且包含事件。使用 Windows Performance Analyzer、PerfView 或 tracerpt 等工具打开它来验证其完整性。

步骤 2:检查函数调用

仔细检查代码,以确保正确调用了 OpenTraceProcessTrace。验证 EVENT_TRACE_LOGFILEW 结构是否正确初始化,包括 LogFileNameEventCallback 字段。

步骤 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:检查错误

查看 OpenTraceProcessTrace 的返回值。如果它们返回错误代码,请使用 GetLastError 检索详细的错误信息。

步骤 7:检查线程和进程标识符

查看 EVENT_TRACE_HEADER 结构中的 ThreadIdProcessId 值。确保回调已为正确的线程和进程注册。

步骤 8:禁用防病毒软件

某些防病毒软件会干扰 ETW 跟踪。暂时禁用它以查看它是否影响了行为。

结论:

排除了这些可能的原因后,你应该能够诊断出 OpenTraceProcessTrace 不返回事件的原因。了解这些故障排除步骤将帮助你解决与 ETW 事件跟踪相关的未来问题。

常见问题解答:

  1. OpenTraceProcessTrace 之间的区别是什么?

    OpenTrace 仅打开一个 .etl 文件,而 ProcessTrace 会处理文件中的事件。

  2. 如何使用 BufferCallback

    BufferCallback 用于自定义缓冲区分配和管理。有关详细信息,请参阅 Microsoft 文档。

  3. 我收到“访问被拒绝”的错误。怎么回事?

    确保你拥有读取 .etl 文件所需的权限,并以管理员身份运行代码。

  4. ETW 事件跟踪中哪些设置会影响性能?

    缓冲区大小、事件级别和跟踪模式都会影响性能。根据你的具体需求进行调整。

  5. 我可以使用 ETW 跟踪什么?

    ETW 可用于跟踪系统性能、应用程序行为和内核活动。