Windows 事件追踪101

本文介绍了Windows事件追踪(ETW)的基础知识,包括其架构、角色(Controller、Provider和Consumer)、特点和应用场景。ETW提供了一种高效、灵活的日志记录机制,适用于系统分析、问题排查和性能优化。文章详细阐述了如何作为消费者使用ETW,如XML清单文件解析、追踪文件(.etl)解析以及通过Logman、Performance Monitor、PowerShell和工具交互。此外,还讨论了ETW与事件日志(.evtx)的关系,并提供了作为提供者的使用指导。
摘要由CSDN通过智能技术生成

ETW 是什么

Event Tracing for Windows® (ETW) is a general-purpose, high-speed tracing facility provided by the operating system. Using a buffering and logging mechanism implemented in the kernel, ETW provides a tracing mechanism for events raised by both user-mode applications and kernel-mode device drivers.

Windows® 事件追踪(ETW)是一种由操作系统提供的多用途、快速的跟踪工具。它通过在内核层面上实现的一套缓冲和日志记录机制,能够跟踪用户级应用和内核级设备驱动程序产生的事件。

--from MSDN Magazine


ETW 具有以下特征:

  • 开发人员可以根据预期用途选择合适的实现集(例如,很容易添加像 WPP 实现这样的 Printf,以用于调试目的的事件)。

  • 基础结构管理常用信息,如时间戳、函数名称和源文件行号。

  • 相同的实现用于用户模式应用和内核模式组件。

  • ETW 可在故障转储和实时调试中进行访问。

  • ETW 可以被重定向到内核调试器以进行实时查看。

  • ETW 具有实时视图。

  • 日志文件保存在二进制日志文件(ETL 文件)中。

  • ETW 支持多进程日志记录。

  • ETW 具有高吞吐量。

  • 可以在另一台计算机上查看日志文件。

  • ETW 支持循环缓冲,以实现持续日志记录和监视。

  • ETW 可以根据目标受众分组到一个通道中。


那我们接下来看看 ETW 是怎么做到这些点的以及我们可以怎么用。首先我们来看看 ETW 的整体架构:

整体架构

总体来说就是:

有一个应用,在做一些事情的时候想记录一下日志,你就可以通过注册一个 provider 来将日志写入 ETW,并向任何请求监听日志的消费者提供信息。

而消费者,则必须启动【会话跟踪】,才能与 provider 交互或者使用 provider 提供的服务。

作为回话,则需要捕获所有指定 provider 提供的信息。

而这些都是由 controller 来控制的。

接下来,我们就来详细的说说具体的模块。

Controller:控制器

所谓 controller,顾名思义,就是用来控制 ETW 的一切。从启动、停止追踪,到启用、禁用特定 provider 的追踪。常用到的一个控制器就是 logman(一款内置的命令行工具)

https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/logman

Provider:提供商

提供程序负责生成事件并将其写入 ETW 会话。应用程序可以注册 ETW 提供程序,并根据需要写入任意数量的事件。ETW 支持四种类型的提供程序:

  • MOF Providers

  • WPP providers

  • Manifest-based providers

  • TraceLogging providers

常见的 provider 有:

Windows 上,所有已注册的 ETW 提供程序都可以从如下注册表中找到:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\

Consumer:消费者

消费者是选择一个或多个事件跟踪会话作为事件源的应用程序。消费者可同时请求多个事件跟踪会话中的事件;系统会按时间顺序交付事件。消费者可以接收存储在日志文件中的事件,也可以从实时提供事件的会话中接收事件。

最常用到的消费者就是事件查看器、性能监听器

为什么要学 ETW

  1. 分析系统行为

分析系统行为可分为两大类:

  • 系统出现问题,可以通过事件查看器等工具查看具体问题和原因。以此来排查各类问题。比如系统提供了 App Error、App hang 等日志可以用来查看应用崩溃和卡死的问题;系统提供了 WMI、COM 相关的 provider 可以用来排查 WMI 和 COM 通信相关的问题。

  • 应用/系统性能影响因素排查。通过结合 WPT 捕获当前系统环境和应用运行情况,可以根据某一瞬间的状况,确定是什么原因直接影响到的。比如:可以通过 WPT 排查开机速度较慢的问题。

  • 分析系统组件或者应用的运行机制。

  1. 给应用提供一种更完备的日志系统

通常情况下,在开发环境下,我们会采取控制台打印的方式记录日志;正式环境下,我们会通过日志文件来记录日常情况。但这两种方式都存在一定的弊端,控制台打印你得是个控制台吧;文件记录是一个非格式文件,只能通过约定特定的字符串来查看日志,无法方便的消费(查看、过滤、收集等)

而 ETW 则可以通过扩展字段的方式,将日志形成格式化文件;按需对不同类型的日志进行保存文件式存储还是实时输出;同时保持最佳性能。

详细的可以参看这个视频:

https://www.bilibili.com/video/BV1XF411Z7Dr

怎么用 ETW

这里主要强调作为消费者来使用 ETW。

作为消费者

作为消费者,也就是使用各种 provider 提供的服务。首先,我们就得学会怎么看,也就是得知道 provider 提供了什么,各种字段表示什么意思。

1.1 XML 清单文件解析

结合 etw 的清单文件一起来看:

https://github.com/nasbench/EVTX-ETW-Resources/blob/main/ETWProvidersManifests/Windows11/22H2/W11_22H2_Pro_20221018_22621.674/WEPExplorer/Microsoft-Windows-Windows%20Defender.xml

<provider>

最上层元素便是<provider>了,它可以用于识别提供者。通常,与之关联的属性有如下几个:

  • Name:顾名思义,就是 provider 的名字

  • Guid:标识 provider 的唯一标识

  • ResourceFilePath:包含元数据的 EXE/DLL 的路径

  • MessageFilePath:包含消息资源的 EXE/DLL 的路径

  • ParameterFilePath:包含提供者字符串资源的 EXE/DLL 的路径

此元素主要提供一些用于识别提供者或者翻译提供者提供事件所需的元数据和字符串。

<channels>

此元素用于定义和配置事件跟踪会话中的事件通道,通过不同的 channel 来配置不同通道的访问权限、保留情况以及事件的存储位置等。 

<Channels>
    <Channel>
        <Message></Message>
        <Path>Microsoft-Windows-Windows Defender/Operational</Path>
        <Index>0</Index>
        <Id>16</Id>
        <Imported>false</Imported>
    </Channel&
  • 40
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值