簡介
我們知道Vistual Studio 2010提供了新的IntelliTrace智能追蹤技術,他協助我們不用單步調試就可快速的查看一段時間裡發生的重要事件,關於智能跟蹤可以參考《使用 IntelliTrace 調試應用程式》。但內建的事件往往還不夠,我們希望擴充這些事件,本文就是介紹如何自訂擴充這些事件。
需求簡介
在我們開發的一個Web項目中,用戶端與服務端重要的一個互動就是傳遞“變更集”的Web請求,他是程式執行的關鍵事件。雖然智能追蹤幫我們提供了Web請求的事件,但是他太多了,而且不能給我應用變更集事件關鍵的會話ID和xml資料,因此,我希望能夠定製自己的“Apply ChangeSet”事件。
看起來定製後的效果應該是這樣的:
Visual Studio的Intellitrace面板能夠看見我定製的“Apply ChangeSet”事件,除此之外,我還希望看見應用變更集時的相關資料:
我的機器安裝的是Vistual Studio 2011 beta,所以畫面可能與Visual Studio 2010稍微不同。
定製追蹤計劃 collectionplan.xml
你需要知道的是,我們並不需要修改原始碼,才能完成事件的記錄,VS是通過一個collectionplan.xml描述追蹤哪些方法,我們要改動這個檔案來完成定製,他通常存在:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace\11.0.0\en
不同版本的Visual Studio其路徑肯定不同,所以你需要自己搜尋一下collectionplan.xml。我是直接修改這個檔案,我沒有找到不破壞這個檔案另外建立檔案的方法,如果你知道請回複我啊。
開啟檔案後,我們首先增加“分類”和“組件”兩個資料,讓我們先改動再看效果就很簡單了。
在Categories建立自己的分類,id和_locID老實說我不清楚區別,我照葫蘆畫瓢而已。
在ModuleSpecifications中添加你希望追蹤的dll,寫檔案名稱就可以了,不用關心版本,所在路徑的問題。
然後在DiagnosticEventSpecifications中添加你希望追蹤的事件,他實際上就是定義你追蹤哪個方法,以及你希望記錄哪些變數。
簡單的我就不介紹了,我也是照葫蘆畫瓢,我說明一下稍微複雜點的。
CatrgoryId和ModuleSpecificationId
CatrgoryId是分類的id,ModuleSpecificationId是前面我們填寫的dll時對應的Id,不要搞錯了。從這裡我們也看出來,一個分類可以包含多個dll的事件,也可以一個dll發送不同分類的事件,完全由你規劃。
MethodId:
我猜想是方法的簽名,反正我嚴格按照規矩填寫就是了,多個參數使用英文的逗號隔開,如果你沒有傳回值,可以填寫: System.Void。
ShortDescription和LongDescription
顧名思義,一個是短描述和長描述,短描述顯示在標題,長描述需要點擊後才能看見。所以短描述要精簡併顯示關鍵資料。他支援變數的,就像我上面的{0},和{1},他指向DataQueries集合的索引。
DataQuery
這裡你可以定義你希望記錄的變數,第一個index的意思是你從哪裡取值,0就是this,1及其以後就是各個參數。
如果取值的對象是一個簡單類型,例如我這裡取的session就是一個字串,那麼query屬性就是空,如果取值的源是對象,你可以使用query擷取其中的欄位值,例如在SqlCommand中,他的長描述中輸出了命令關聯的連接字串,像這樣:
顯然他可以使用私人變數,並不斷的層級訪問。而且你不必小心處理_connection是null造成運算式失敗。
至於如何擷取傳回值,(⊙o⊙)…我沒有找到。
編程方式擷取值
如果注意往下看其他的配置,好像還支援編程的方式擷取值,例如:
這個Microsoft.VistualStudio.DefaultDataQueries.dll也是用.net編寫的程式,反編譯你就能看見實現的方法,實現IProgrammableDataQuery介面即可。功能上當然要強一些,比如可以擷取傳回值,自己格式化資料。
在Visual Studio中查看效果
萬事俱備,儲存檔案後你需要重新啟動Visual Studio,先點擊工具-》選項-》智能追蹤。你可以看見我們自訂的分類。
現在當你調試代碼時,就可以在InterlliTrace中看見我們攔截的事件了。
調試愉快