簡介
我們知道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中看見我們攔截的事件了。
調試愉快