上週我親自跑去基隆處理一個程式問題,由於當場的環境缺乏檢測工具,且我們之前的程式 ( Windows 服務 ) 並沒有寫很多追蹤(Trace)的程式碼,只有將一些摘要資訊寫入 EventLog,導致在當場花了許多時間,而且最後還是沒有抓出問題,白白浪費了一個下午。
由於程式不是我寫的,回來之後開始狂 K 原始碼,試圖查出問題的所在,感覺已經查到問題,但我這邊因為缺乏客戶的執行環境,所以有還是有許多數據必須在客戶端當場才收集的到。
到時如果我將一大堆除錯資訊送進 EventLog 將會對系統造成一些效能上的負擔,因此我需要尋找另一個更完美的解決方案,沒錯,我找到了,就是 NTrace ( High Performance Tracing for .NET Applications )
NTrace 是一套 100% 用 C# 寫成的函示庫,且目前只能套用在 C# 的專案用,最大的特色在於 NTrace 使用 Event Tracing for Windows (ETW) 技術紀錄各種事件追蹤。
ETW 是一個在作業系統核心層級(Kernel-level)的服務,通常用於驅動程式開發的領域,因為大多數驅動程式會在 Kernel-level 執行,除了追蹤除錯不易之外,效能也是另一個考量,所以可想見 ETW 絕對是個超高效能的事件追蹤工具,我想唯一的缺點應該是他比較不容易上手吧,一般人看到「驅動程式開發」就會怕了。
NTrace / ETW 大致的運作原理如下:
- 透過 NTrace 函示庫將欲紀錄的事件/除錯/追蹤資訊傳送到 ETW 服務
- 當你有建立 ETW 的 Tracing Session ( Log Session ) 時,就可以從 ETW 服務收到追蹤紀錄資訊
- 當你未建立 ETW 的 Tracing Session 時,這個傳送到 ETW 服務的資訊就會自動被忽略
由於透過 ETW 的 API 將紀錄資訊寫入 ETW 服務的效能極高,所以這些寫入 ETW Log 的指令碼「幾乎」不會對原有程式造成任何效能上的負擔,所以你可以將所有可提供除錯的資訊通通傳到 ETW 服務中,當需要偵測/追蹤錯誤時,只要透過 Windows Server 2003 DDK 提供的追蹤工具 ( traceview.exe / tracelog.exe ) 就可以隨時追蹤程式執行的相關資訊。
你在安裝 Windows Server 2003 DDK 時,只要需要選取 Software Tracing Tools 即可 ( 如下圖 ),安裝好的工具會擺在 D:\WINDDK\3790.1830\tools\tracing\i386 目錄下:
雖然從 .Net Framework 3.5 開始在 System.Diagnostics.Eventing 命名空間中有新增一項 EventProviderTraceListener 類別,不過該類別只能在 Windows Vista 以上的機器使用,所以使用上還是會有些相容性的問題。
但事實上 ETW 服務從 Windows 2000 就已經有了,NTrace 是直接使用 ETW API 進行操作,所以使用上相容性非常高。
若要上手 NTrace 建議可以先從 下載區 的 Using ETW Tracing in your Application.pdf 文件開始,這份文件有更詳細的說明與使用 NTrace 執行效能比較高的測試數據。
我今天測試在 ASP.NET Web Application 專案中還無法使用 NTrace,但我相信過不了多久就會釋出更新版,到時 NTrace 應該會提供 ASP.NET 的 Visual Studio 專案範本(Project Template)。
最後,透過 ETW 追蹤工具 ( traceview.exe / tracelog.exe ) 取得的紀錄檔 ( *.etl ),也可以透過 Log Parser 進行統計分析,所以使用上的彈性也挺高的。若要透過更加視覺化的介面進行查看紀錄,也有個ETViewer - An easy to use ETW / WPP trace viewer 工具可用。
相關連結