﻿# 使用超高效率的 NTrace 套件追蹤 .NET 程式執行效能與除錯

上週我親自跑去基隆處理一個程式問題，由於當場的環境缺乏檢測工具，且我們之前的程式 ( Windows 服務 ) 並沒有寫很多追蹤(Trace)的程式碼，只有將一些摘要資訊寫入 EventLog，導致在當場花了許多時間，而且最後還是沒有抓出問題，白白浪費了一個下午。

由於程式不是我寫的，回來之後開始狂 K 原始碼，試圖查出問題的所在，感覺已經查到問題，但我這邊因為缺乏客戶的執行環境，所以有還是有許多數據必須在客戶端當場才收集的到。

到時如果我將一大堆除錯資訊送進 EventLog 將會對系統造成一些效能上的負擔，因此我需要尋找另一個更完美的解決方案，沒錯，我找到了，就是 [NTrace](http://www.codeplex.com/NTrace) ( High Performance Tracing for .NET Applications )

[NTrace](http://www.codeplex.com/NTrace) 是一套 100% 用 C# 寫成的函示庫，且目前只能套用在 C# 的專案用，最大的特色在於 [NTrace](http://www.codeplex.com/NTrace) 使用 [Event Tracing for Windows (ETW)](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 技術紀錄各種事件追蹤。

[ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 是一個在作業系統核心層級(Kernel-level)的服務，通常用於**驅動程式**開發的領域，因為大多數驅動程式會在 Kernel-level 執行，除了追蹤除錯不易之外，效能也是另一個考量，所以可想見 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 絕對是個超高效能的事件追蹤工具，我想唯一的缺點應該是他比較不容易上手吧，一般人看到「驅動程式開發」就會怕了。

[NTrace](http://www.codeplex.com/NTrace) / [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 大致的運作原理如下：

-   透過 [NTrace](http://www.codeplex.com/NTrace) 函示庫將欲紀錄的事件/除錯/追蹤資訊傳送到 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務
-   當你有建立 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 的 Tracing Session ( Log Session ) 時，就可以從 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務收到追蹤紀錄資訊
-   當你未建立 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 的 Tracing Session 時，這個傳送到 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務的資訊就會自動被忽略

由於透過 [ETW](http://msdn.microsoft.com/en-us/library/aa468736.aspx) 的 API 將紀錄資訊寫入 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務的效能極高，所以這些寫入 ETW Log 的指令碼「幾乎」不會對原有程式造成任何效能上的負擔，所以你可以將所有可提供除錯的資訊通通傳到 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務中，當需要偵測/追蹤錯誤時，只要透過 [Windows Server 2003 DDK](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) 提供的追蹤工具 ( traceview.exe / tracelog.exe ) 就可以隨時追蹤程式執行的相關資訊。

你在安裝 [Windows Server 2003 DDK](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) 時，只要需要選取 Software Tracing Tools 即可 ( 如下圖 )，安裝好的工具會擺在 D:\\WINDDK\\3790.1830\\tools\\tracing\\i386 目錄下：

![Microsoft Windows Driver Development Kit](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b251f3f1619d37a78246-image_3.png)

雖然從 .Net Framework 3.5 開始在 [System.Diagnostics.Eventing](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.eventing.aspx) 命名空間中有新增一項 [EventProviderTraceListener](http://msdn.microsoft.com/zh-tw/library/system.diagnostics.eventing.eventprovidertracelistener.aspx) 類別，不過該類別只能在 Windows Vista 以上的機器使用，所以使用上還是會有些相容性的問題。

但事實上 [ETW](http://msdn.microsoft.com/en-us/library/bb968803\(VS.85\).aspx) 服務從 Windows 2000 就已經有了，[NTrace](http://www.codeplex.com/NTrace) 是直接使用 ETW API 進行操作，所以使用上相容性非常高。

若要上手 [NTrace](http://www.codeplex.com/NTrace) 建議可以先從 [下載區](http://www.codeplex.com/NTrace/Release/ProjectReleases.aspx?ReleaseId=23436) 的 [Using ETW Tracing in your Application.pdf](http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=NTrace&DownloadId=51518)  文件開始，這份文件有更詳細的說明與使用 [NTrace](http://www.codeplex.com/NTrace) 執行效能比較高的測試數據。

我今天測試在 ASP.NET Web Application 專案中還無法使用 [NTrace](http://www.codeplex.com/NTrace)，但我相信過不了多久就會釋出更新版，到時 [NTrace](http://www.codeplex.com/NTrace) 應該會提供 ASP.NET 的 Visual Studio 專案範本(Project Template)。

最後，透過 ETW 追蹤工具 ( traceview.exe / tracelog.exe ) 取得的紀錄檔 ( \*.etl )，也可以透過 [Log Parser](http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07) 進行統計分析，所以使用上的彈性也挺高的。若要透過更加視覺化的介面進行查看紀錄，也有個[ETViewer - An easy to use ETW / WPP trace viewer](https://web.archive.org/web/20080307034526/http://code.msdn.microsoft.com:80/etviewer) 工具可用。

**相關連結**

-   [NTrace - High Performance Tracing for .NET Applications](http://www.codeplex.com/NTrace)
-   [Announcing NTrace v1.0](http://www.wintellect.com/CS/blogs/ahopper/archive/2008/11/09/announcing-ntrace-v1-0.aspx)
-   [WDK and Developer Tools](https://learn.microsoft.com/en-us/windows-hardware/drivers/) > [Testing Tools](https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/) > [Event Tracing](https://learn.microsoft.com/en-us/windows/win32/etw/event-tracing-portal)
-   [ETW Tracing](http://msdn.microsoft.com/en-us/library/ms751538.aspx) ( C# ) / [WPP Software Tracing](http://msdn.microsoft.com/en-us/library/ms793164.aspx)
-   [Improve Debugging And Performance Tuning With ETW](http://msdn.microsoft.com/en-us/magazine/cc163437.aspx)
-   [Windows Server 2003 DDK](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) 
-   [Logman](http://technet.microsoft.com/en-us/library/cc753820.aspx)
-   [ETViewer - An easy to use ETW / WPP trace viewer](https://web.archive.org/web/20080307034526/http://code.msdn.microsoft.com:80/etviewer)
