.net程序調試一:快速定位異常

做爲一個程序員,解BUG是咱們工做中常作的工做,甚至能夠說解決問題能力是一我的工做能力的重要體現。由於這體現了一個程序員的技術水平、技術深度、經驗等等。c++

那麼在咱們解決BUG的過程當中,定位問題是很是重要的。有句話叫"發現問題是解決問題的一半。程序員

本文講述就快速定位異常(專指.NET程序異常)的方法。包括在本機定位異常,在客戶環境定位.net程序異常,在客戶環境定位SilverLight異常。瀏覽器

一:定位本機異常服務器

在咱們本機定位異常很容易。假設咱們都是使用的的VisualStudio,那麼只須要在調試->異常菜單中將Common Langeuage Runtime Exception(CLR異常)勾選。以下圖:函數

                       

在上面的圖片中能夠發現有5種類型的異常,例如c++異常、win32異常等等。對於.NET程序來講咱們只關注CLR異常。工具

接下來進行調試,當本身的程序代碼中有異常的時候,VS就會自動定位到異常的位置。開發工具

咱們能夠看到異常的詳細信息,而且可在調用堆棧窗口中看到 程序的堆棧信息。在堆棧信息中咱們能夠看到在哪一個類、哪一個函數中出的錯,以下圖:ui

 

調試程序有兩種方式,一種是用VS直接啓動程序,另外一種是附加到進程。.net

 

 

附加到進程的時候,程序類型不要選錯了,我使用的是.net4.0 因此程序類型選擇的是 託管(4.0版)代碼。命令行

另外附加到進程有個快捷鍵是 Ctrl+Alt+P。

可是若是異常不是你的代碼中拋出的,那麼如何定位呢?

能夠打開 調試 菜單下面的 選項和設置,將 啓用"僅個人代碼" 這一項取消勾選。那麼別人代碼中的異常就能夠拋出了。

 

二:在客戶環境定位.net程序異常:

咱們的程序最後都會運行在客戶的環境中,客戶環境上不會有VS這樣的開發工具,那麼怎麼辦呢?

咱們可使用一個很小巧的命令行調試工具Mdbg.exe,這個工具是安裝VS的時候附帶安裝的,僅能調試.net託管代碼。

Mdbg.exe其實有不少功能,不過本文只講它定位異常的功能,後續文章會講使用Mdbg.exe單步調試的方法。

Mdbg.exe命令詳細介紹能夠 輸入 h(help) 或者? 名來查看,也能夠看下面的連接,

http://msdn.microsoft.com/zh-cn/ms229861(vs.80).aspx#

根據CLR版本的不用,Mdbg.exe也是有多個版本的。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\Mdbg.exe用於調試

CLR2.0(對應net2.0,3.0,3.5)程序。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\Mdbg.exe用於調試CLR4.0程序(對用.net4.0)。

另外Mdbg.exe有一個依賴DLL 叫作MdbgCore.dll。咱們能夠直接將相應版本的Mdbg.exe和MdbgCore.dll拷貝到客戶機器上使用。

沒有安裝VS的朋友能夠拷貝我本身封裝的一個安裝包 http://files.cnblogs.com/yuilin/U8DebugSetup.rar,這裏面除了Mdbg.exe還有一些其餘組件咱們後面的文章會用到。

默認會安裝在 C:\Program Files\U8Debug。

Mdbg.exe的使用方法很加簡,雙擊打開它,而後輸入 a(attach顯示附加的進程),回車,這時會列表全部能夠附加的進程。

 

PID 表示進程標識,

輸入a 11940 附件到 ConsoleApplication2.ex示例程序。

這時程序會中斷執行,咱們在這個時機能夠作一些設置。讓程序在遇到異常時自動中斷。

輸入命令 ca (catch)查看當前調試器遇到哪些事件會中斷。

 

能夠看到 Exception對應的是Igonre all exception ,也就是忽略全部異常,發生異常時不會中斷。

輸入命令 ca ex 這樣調試器遇到異常時就會中斷了。

再次輸入ca 命令會看到 Exception對應的值已經變爲Stop on all exception了。這時遇到任何異常都會中斷了。

 

輸入命令 g 讓程序繼續執行。

當遇到異常時會自動中斷到調試器,以下圖:

 

入命令 w(where,程序運行到哪裏了) 能夠查看異常堆棧信息

 

三:在客戶環境定位SilverLight異常

若是客戶的silverlight應用服務器部署在外網,那麼咱們能夠直接用瀏覽器訪問該silverlight站點,而後用VS附加到瀏覽器進程來調試。

 

調試方法比調試普通.net程序同樣。

可是若是,客戶的Silverlight服務器是部署在內網,那麼你只能在客戶機器上調試了。

而且Mdbg.exe也幫不了你了,它不能調試Silverlight程序。

咱們還有另外一個著名的調試工具Windbg。體積大概有不到20M,很容易安裝到客戶機,安裝包你們能夠到網上本身下載。windbg分爲32位和64位兩個版本,

調試32位的程序請使用32位windbg,反之則要使用64位的windbg,具體爲何咱們不用深究,記住了就能夠了。

相比Mdbg.exe的小巧實用,Windbg顯然強大的多,可是使用起來也複雜一些。

Windbg其實能夠調試不少種類型的程序,例如普通.NET程序,c++等。可是本文只講解使用windbg定位異常的方法。

首先咱們使用IE瀏覽器打開silverlight應用程序,而後打開windbg附件到IE進程來調試。附加進程的方式能夠經過File菜單下的Attach to a process或者使用F6快捷鍵。

 

附件進程後 程序會中斷到調試器,這個時候咱們須要作兩個設置。

一個是 設置程序發生異常時讓其中斷到調試器,設置方法是打開debug菜單下的Event Filter,將CLR異常設置其爲enable。

 

另外須要加載調試器擴展,使用過windbg的朋友都知道調試.net程序須要加載一個調試器擴展sos.dll。這個sos.dll也有一個Silverlight版本的。

位置在silverlight的安裝目錄 C:\Program Files (x86)\Microsoft Silverlight\5.1.10411.0\sos.dll。

咱們再command窗口中輸入 .load C:\Program Files (x86)\Microsoft Silverlight\5.1.10411.0\sos.dll 來加載它。

以後輸入命令 g 來回復程序的執行。當發生異常時就會中斷到調試器中。

發生異常是咱們可使用!pe(print exception) 來查看異常信息。以下圖:

 

若是想查看堆棧信息的話能夠輸入命令 !clrstack

經過上述方法基本能夠定位全部的.NET異常。至此,本文結束。

相關文章
相關標籤/搜索