ETW 是一种跟踪机制,允许用户将事件记录到文件或缓冲区中。有关 ETW 的概述可参见此处。其基本架构包括提供程序(Provider)、控制器(Controller)和消费者(Consumer)。控制器定义并控制捕获会话,包括会话中包含哪些提供程序,以及启动和停止会话。提供程序使用 GUID(全局唯一标识符)指定,将事件记录到一系列缓冲区中。消费者从缓冲区或文件中接收消息,并按时间顺序处理它们。
该模块是一个完全基于 Python 的 ctypes 封装,围绕控制 ETW 会话和处理消息数据所需的 Win32 API 构建。该模块非常灵活,可以设置捕获前或捕获后的过滤器。
要使用此模块,请导入 etw,并通过传入一个或多个 ProviderInfo 实例的列表来创建 ETW 类的实例,这些实例对应您希望从中捕获数据的提供程序。要处理从 ETW 返回的数据,您需要指定一个回调函数。
import etw
def some_func():
# 定义捕获提供程序信息
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
# 创建 ETW 实例并开始捕获
with etw.ETW(providers=providers, event_callback=etw.on_event_callback):
# 运行捕获
etw.run('etw')
下面是一个使用该模块通过自定义回调执行捕获的示例。
import time
import etw
def some_func():
# 定义捕获提供程序信息
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
# 创建 ETW 类实例
job = etw.ETW(providers=providers, event_callback=lambda x: print(x))
# 开始捕获
job.start()
# 等待一段时间
time.sleep(5)
# 停止捕获
job.stop()
子类化是定义 ETW 捕获类的另一种便捷方式。
import time
import etw
class MyETW(etw.ETW):
def __init__(self, event_callback):
# 定义捕获提供程序信息
providers = [etw.ProviderInfo('Some Provider', etw.GUID("{11111111-1111-1111-1111-111111111111}"))]
super().__init__(providers=providers, event_callback=event_callback)
def start(self):
# 执行捕获前设置
self.do_capture_setup()
super().start()
def stop(self):
super().stop()
# 执行捕获后清理
self.do_capture_teardown()
def do_capture_setup(self):
# 在此处执行捕获所需的任何设置
pass
def do_capture_teardown(self):
# 在此处执行捕获所需的任何清理
pass
def my_capture():
# 实例化类
capture = MyETW(lambda x: print(x))
# 开始捕获
capture.start()
# 等待一段时间以捕获数据
time.sleep(5)
# 停止捕获
capture.stop()
更多示例请参见示例。