ETW
ETW(Event trace for Windows)
是微软提供的追踪和记录
由应用程序和内核驱动事件的机制。ETW
已经由Windows操作系统实现了,所以我们无需对其编程。并且在此基础上提供给了开发者一些快速、可靠、通用的事件追踪特性。
ETW架构图(取自MSDN)
- 下面解释一些
ETW架构
中使用到的概念
Providers(事件提供者)
:具体是指提供事件的一些对象,最终抓取到的事件都是来源于它们的Consumers(事件收集者)
:有时也称Collector
,具体是指收集事件的一些对象,这个一般在WPR
或者是Xperf
中已经编写好了,我们不需要担心这一部分。Session(事件追踪会话)
:可以理解成追踪事件的一次过程,此时追踪事件的所有数据都还在内存当中,到最后结束追踪的时候Controllers(事件追踪控制者)
:开启或关闭事件追踪会话
Kernel Provider ···· User Provider
- 从字面的含义去解释它就是
内核级(Kernel)
和用户级(User)
的事件提供者,或者更简单一点,系统已经定义好的Provider
就称为System Provider
或Kernel Provider
。而由开发者自定义的Provider
就称为User Provider
System Provider ···· Kernel Session ···· Kernel Event
System Provider
:真名是Windows Kernel Trace
,顾名思义,是一个内核级别的事件提供者,因此我们可以说只要你在使用Windows操作系统
你就可以追踪到它提供的事件。并且System Provider
提供的事件只能被Kernel Session
追踪Kernel Session
:我们之前提到过Session
的概念,不难理解Kernel Session
也是一次事件追踪的过程,只不过Kernel Session
这次过程追踪的事件都是由System Provider
提供的。Kernel Event
:是由System Provider
产生的内核事件,交给Kernel Session
追踪
我们可以通过如下步骤
1)找到命令提示符
以管理员身份打开
2)使用logman命令
查看System Provider
的情况
logman query providers "Windows Kernel Trace"
注:这里的keyword字段可能会令大家迷惑。这里可以大概模拟一个情形,由于Provider提供了许多类型的事件,所以如果我们对其中所有的事件都进行追踪将会使得最后的.etl文件非常大,从而浪费磁盘空间。所以keyword的实际上相当于一种过滤机制,让开发者可以只追踪一小部分的事件。
3)使用logman命令
查看session
的情况
logman -ets
命令行方式使用WPR
在我的《如何使用WPR
和WPA
记录系统状态》博文中已经提到了如何用UI(User interface)
的方式开启记录和关闭记录。这里不做赘述。下面介绍通过命令行方式使用WPR的方法。
1)首先我们可以通过如下命令查看wpr
提供的内置监控配置文件(built-in profile
)
wpr -profiles
注:该命令必须在(以管理员身份打开的cmd.exe中)执行,否则会拒绝访问
2)profile
配置文件定义了开启哪些Provider
,我们可以通过如下命令查看CPU profile
开启了哪些Provider
wpr -profiledetails CPU
3)通过上述的两个命令,我们可以选取一个内建的profile
来开启记录,比如选取CPU profile
,命令如下
wpr -start CPU
4)等待几秒,执行wpr -stop xxx.etl
命令保存日志文件
wpr -stop test.etl
注:test.etl文件会生成在你cmd.exe的工作路径下,如下图