Skip to content
九月 25, 2009 / wychi

Use ETW in C# and watch log via TraceView

在看了關於ETW的介紹後(使用 ETW 改善偵錯和效能調整 ), 我想很難有人不心動的..

想較於原始的OutputDebugString/TRACE (in C/C++) 或是 .Net System.Diagnostics.Trace.Write() 搭配 default trace listener

不管在效能或調用彈性上,ETW 都遠勝好幾籌

以.Net default trace  來說, 在都關閟log的情況下, .Net Trace 與 ETW有60倍以上的差距

可以從下的benchmark中看出,

The testing code is simple.

   1:  const int NumIterations = 1000000;
   2:  for (int index = 0; index < NumIterations; index++)
   3:  {
   4:          dummy = dummy / (index + 1);
   5:          Trace.WriteLine(string.Format("Test {0}",index));
   6:  }

The result.

[6808] No Tracing: 8.7894 milliseconds.

[6808] .NET Tracing (Remove default listener): 619.1644 milliseconds.

[6808] .NET Tracing: 26390.6618 milliseconds.

[6808] ETW Tracing: 10.7426 milliseconds.

The second run, I turn on ETW trace viewer.

[6808] No Tracing: 7.8128 milliseconds.

[6808] .NET Tracing (Remove default listener): 599.6324 milliseconds.

[6808] .NET Tracing: 24760.7164 milliseconds.

[6808] ETW Tracing: 8905.6154 milliseconds.

其實, 早在Windows Server 2003, Windows XP, and Windows 2000 platforms 就以經有ETW了

不過一直到 .Net 3.5 才在System.Diagnostics加入對ETW操做的class, EventProvider / EventProviderTraceListener

透過這些classes, 基於.Net 3.5的程式可以很方便的來使用ETW, 有興趣的朋友可以參考這裡  Diagnostics: Using ETW tracing in .NET 3.5 (EventProviderTraceListener)

C/C++/ .Net3.0 的人就要自行使用ETW提供的APIs來進行操作

另外, 還有一些進階的方法來使用ETW, 例如

在學習ETW中, 困擾我的其實都不是調用ETW APIs/Classes

而是, 當一切都準備好之後, 才發現….不知道怎麼看到log

以前只要將DebugView打開,就能看到程式寫出來的log,現在都完全不見了..

在奮鬥了一天之後, google了無數文章之後, 才逐步拚湊出來, 最後總算能看到log

說真的要看到ETW的log, 還真的蠻麻煩的,

因為ETW為了高效, 採用 Controller / Producer /  Consumer pattern, 並用使binary format 來儲存log

剛才上述提到的步驟都只是在建立Producer, 為了要看到log 我們還需要Controller/Consumer

Controller/Consumer這一部分,我們以可利用現在的工具 traceview / ETViewer

最麻煩跟最另人困惑的在於如何提供TMF (Trace Message Format File),

在traceview 建立log session時,需要指定provider GUID還有 TMF, 兩者搭配才能在traceview看到正確的log

當我一開始在使用 .Net 3.5 的EventProvider / EventProviderTraceListener時, 我完全沒辦法在traceview上看到正確的log

因為我不知道從那裡取得 .Net 3.5 EventProvider 的TMF, (TMF 都是由 provider制定的..)

在多次試驗後,我總算產生了一份TMF 可以正確顯示log了

   1:  7dd732fd-73d7-dad2-35fd-a0a4106690fb WpfApplication1
   2:  #typev window1 0 "Message: (%10!s!)"
   3:  {
   4:      Message, ItemPWString -- 10
   5:  }
   6:  

如此一來,總算是成功的踏出第一步

接下來就是要與OS做更緊密的合作囉….

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: