文章目錄
- 1.1.1基本設定
- 1.1.2調試.NET Framework原始碼
摘要:一直以來有聽說微軟公開了.NET Framework的一些類,可以讓我們通過VS2008進行調試查看,最近嘗試了一下該功能,通過斷點調試微軟提供的原始碼,總體感覺微軟還是向開源邁開了一大步,不過感覺調試操作很麻煩而且只可以看不允許做出任何修改,那還不如通過反編譯查看來的快捷。還有就是如果微軟能把.NET Framework一些類圖也自動產生出來那就是very good啦。
1.1.1基本設定
首先要確認您所使用Visual Studio 2008版本(Express versions除外)才具有調試.NET Framework原始碼功能(最好先打sp1在安裝)。
1)現在我們要下載一個補丁Visual Studio 2008 QFE,來更新VS2008中調試功能中的DLL檔案。
2)接下來我們運行VS2008,然後選擇工具->選項->調試->常規(Tools > Options > Debugging > General),接著我們修改常規中的設定如下:
取消選擇“啟用Just My Code”(Enable Just My Code)
選擇“啟用原始伺服器支援”(Enable source server support)
圖1調試中設定
3)接下來我們添加“符號”中的設定,首先設定符號檔案的,輸入一個URL地址http://referencesource.microsoft.com/symbols,然後我們再設定一個本地儲存位置。然後選擇“只在手動載入符號是搜尋上述位置”。
圖2符號中設定
1.1.2調試.NET Framework原始碼
完成了上述簡單的安裝和設定之後,我們可以調試原始碼了。讓我們建一個簡單的WinForm程式測試一下調試效果如何,添加代碼如下而且當我們開始調試時候VS就會自動下載用於調試原始碼dll檔案。
圖3下載調試dll檔案
圖4設定調試斷點
當我們開始debug時候發現VS會變得很慢,這是由於我們要在從微軟中下載.NET Framework提供的調試原始碼。當下載完畢後我們就可以進入斷點了。
接著我們要選擇載入符號的位置,我們選擇堆棧視窗的其中一個dll檔案,然後右鍵選擇載入符號,這裡可以選擇從網路上進行載入(很慢)或根據已經下載好的原始碼檔案地址進行調試。(選擇本地載入)
圖5選擇載入符號方式
由於我已經載入了符號檔案所以這裡不用再設定了,現在我們按F11或可以直接點擊堆棧視窗的dll檔案就可以進入原始碼調試了。
如果在堆棧視窗沒有找到我們要進入的dll檔案我們可以手動添加,例如我們在Form裡面添加了Paint方法,但我們在堆棧視窗沒有找到System.Drawing的dll檔案,那麼我們通過以下方法添加該dll檔案。
圖6手動添加dll檔案
現在我們可以調試.NET Framework的原始碼了,但是我們發現每次調試VS都會下載符號檔案這使得VS啟動並執行十分慢,這是由於我們每次調試都要重新從微軟中載入符號檔案,但我們已經把符號檔案下載到本地儲存起來了,還記得嗎?我們在前面設定了從網上載入,那麼我們可以關閉下載調試功能,從而改為使用本地檔案進行調試即可。
前面提到我們要把微軟提供的可調試dll檔案都下載都本地,所以我們要確保一次過把調試檔案都下載下來,結果我們只有對調試設定修改一下就OK了。
圖7選擇載入符號方式
現在我們重新偵錯工具,這次下載符號檔案時間較長,因為這次會把微軟提供可調試dll檔案都下載到本地,而且檔案大小有50MB,然後下載完畢之後VS會自動進入斷點,接著我們停止調試,取消選擇從微軟下載符號檔案,因為我們現在要使用本地符號檔案進行調試。
圖8取消選擇
現在我們可以載入本地的調試檔案進行調試,從而不影響VS的運行效率了。微軟官方提供可調試dll檔案如下,我相信以後微軟還會提供給更多的可調試dll檔案,我們現在不僅僅可以通過反編譯器查看原始碼,還可以斷點調試原始碼即使不能修改原始碼:
- Mscorlib.DLL
- System.DLL
- System.Data.DLL
- System.Drawing.DLL
- System.Web.DLL
- System.Web.Extensions.DLL
- System.Windows.Forms.DLL
- System.XML.DLL
- WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll, some others)
- Microsoft.VisualBasic.DLL
如果大家想瞭解更多可以查看Shawn Burke's Blog