关于事件跟踪

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

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

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

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

event tracing model

Controllers

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

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

提供程序

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

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

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

提供程序类型

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

MOF (经典) 提供程序:

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

WPP 提供程序:

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

基于清单的提供程序:

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

TraceLogging 提供程序:

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

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

使用者

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

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

缺少事件

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

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

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

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

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

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