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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM