关于事件跟踪

Windows 事件跟踪 (ETW) 是一种有效的内核级跟踪工具,允许你将内核或应用程序定义的事件记录到日志文件中。 可以实时使用事件或从日志文件使用事件,并使用它们调试应用程序或确定应用程序中发生性能问题的位置。

ETW 允许动态启用或禁用事件跟踪,从而可以在生产环境中执行详细跟踪,而无需重启计算机或应用程序。

事件跟踪 API 分为三个不同的组件:

下图显示了事件跟踪模型。

事件跟踪模型

Controllers

控制器是定义日志文件的大小和位置、启动和停止 事件跟踪会话、启用提供程序以便它们可以将事件记录到会话、管理缓冲池大小以及获取会话的执行统计信息的应用程序。 会话统计信息包括使用的缓冲区数、传递的缓冲区数以及事件数和丢失的缓冲区数。

有关详细信息,请参阅 控制事件跟踪会话

提供程序

提供程序是包含事件跟踪检测的应用程序。 提供程序注册自身后,控制器可以在提供程序中启用或禁用事件跟踪。 提供程序定义其启用或禁用的解释。 通常,启用的提供程序会生成事件,而禁用的提供程序不会生成事件。 这使你可以向应用程序添加事件跟踪,而无需一直生成事件。

尽管 ETW 模型将控制器和提供程序划分为单独的应用程序,但应用程序可以同时包含这两个组件。

有关详细信息,请参阅 提供事件

提供程序类型

有四种main类型的提供程序:MOF (经典) 提供程序、WPP 提供程序、基于清单的提供程序和 TraceLogging 提供程序。 如果要为 Windows Vista 或更高版本编写不需要支持旧系统的应用程序,则应使用基于清单的提供程序或 TraceLogging 提供程序。

MOF (经典) 提供程序:

  • 使用 RegisterTraceGuidsTraceEvent 函数注册和写入事件。
  • 使用 MOF 类定义事件,以便使用者知道如何使用它们。
  • 一次只能由一个跟踪会话启用。

WPP 提供程序:

  • 使用 RegisterTraceGuidsTraceEvent 函数注册和写入事件。
  • 将关联的 TMF 文件 (编译为二进制文件的 .pdb) ,其中包含从预处理器扫描源代码中的 WPP 检测推断出的解码信息。
  • 一次只能由一个跟踪会话启用。

基于清单的提供程序:

  • 使用 EventRegisterEventWrite 注册和写入事件。
  • 使用清单定义事件,以便使用者知道如何使用它们。
  • 最多可以同时通过八个跟踪会话启用。

TraceLogging 提供程序:

  • 使用 TraceLoggingRegisterTraceLoggingWrite 注册和写入事件。
  • 使用自描述事件,以便事件本身包含使用它们所需的所有信息。
  • 最多可以同时通过八个跟踪会话启用。

所有事件提供程序从根本上将事件跟踪系列 API (TraceEvent 用于旧技术,将 EventWrite/EventWriteEx 用于较新的) 。 事件提供程序在事件有效负载中存储的字段类型以及存储关联的事件解码信息的位置上有所不同。

使用者

使用者是选择一个或多个事件跟踪会话作为事件源的应用程序。 使用者可以同时从多个事件跟踪会话请求事件;系统按时间顺序传递事件。 使用者可以接收存储在日志文件中的事件,也可以从实时传送事件的会话接收事件。 处理事件时,使用者可以指定开始和结束时间,并且仅传递在指定时间范围内发生的事件。

有关详细信息,请参阅 使用事件

缺少事件

Perfmon、系统诊断和其他系统工具可能会报告事件日志中缺少的事件,并指示 Windows (ETW) 的事件跟踪设置可能不是最佳设置。 事件可能由于多种原因而丢失:

  • 总事件大小大于 64K。 这包括 ETW 标头以及数据或有效负载。 用户无法控制这些缺失的事件,因为事件大小由应用程序配置。

  • ETW 缓冲区大小小于事件总大小。 用户无法控制这些缺失的事件,因为事件大小是由记录事件的应用程序配置的。

  • 对于实时日志记录,实时使用者使用事件的速度不够快或完全不存在,然后备份文件将填满。 如果事件日志服务停止并在记录事件时启动,则可能会导致此情况。 用户无法控制这些缺失事件。

  • 记录到文件时,磁盘速度太慢,无法跟上日志记录速率。

出于上述任何原因,请向生成事件的应用程序或服务的提供程序报告这些问题。 这些问题只能由应用程序开发人员或服务记录事件来解决。 如果在事件日志服务中报告缺少的事件,这可能表示事件日志服务的配置存在问题。 用户可能具有一些有限的能力来增加事件日志服务使用的最大磁盘空间,这可以减少缺失事件的数量。