ETW (Event Tracing for Windows)介绍

ETW主要包括3个component:Controller, Provider, and Consumer.

Controller的主要任务有两个:

一是,用StartTrace在内存中创建一个event trace session。刚创建时,这个session是没有跟任何provider关联的,也就不会任何数据被写到这个session的buffer中,,当然这一步也是可以完成关联的,那就是把StartTrace的参数Wnode.Guid member of Properties设置为provider id.问题:(Wnode.Guid什么时候应该设置,应该设置为什么值??)

二是,启动(API: EnableTrace)和停止(API: ControlTrace)Provider(它是使用Provider的GUID来区分不同的provider的)。Controller的第二个任务就是为了避免额外的开销,Provider不会一直都在工作,只有当被Enable的时候,才开始工作(注:其实这么说是不正确的,Provider其实是不必受Controller控制的,它可以随时随地发送trace,只要它知道那个event trace session的句柄,这完全取决于Provider具体是怎么写的。但在实际操作上,Provider都是根据Controller的Enable/Disable信号来启动和停止tracing的。)问题: Provider如何知道Session的Handle呢?

etw_architecture

第二个是Consumer,Consumer主要做这几件事:

1. 用OpenTrace打开和event trace session之间的通道。

2. 设计event trace callback,你可以设计一个generic的callback用来handle所有的event trace,不管是不是你感兴趣的。你也可以为特定的event trace设计callback,专门处理你关心的trace。Generic的callback实在OpenTrace的时候在参数中指定的,而特定的callback可以用SetTraceCallback来注册。

3. 调用ProcessTrace,开始处理Trace。注意,这里有一个很tricky的地方:ProcessTrace是block的!就是说ProcessTrace不会返回,除非Controller结束这个session或者Consumer自己调用CloseTrace(注:CloseTrace只有在Longhorn可以使ProcessTrace返回,XP不行)。呵呵,那你问了,ProcessTrace都不返回,我的Consumer还怎么调用CloseTrace啊?答案很简单:你需要第二个线程,那个线程什么也没干,就调用了ProcessTrace,然后它就待在那里,直到Consumer的主线程调用CloseTrace或者Controller关闭了整个session。我知道这个方法很奇怪,但,不要问我,这是ETW team给我的答案,他们肯定有他们的考虑。

Reference: http://msdn.microsoft.com/en-us/magazine/cc163437.aspx

原文地址:https://www.cnblogs.com/whyandinside/p/2663917.html