佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > .NET程序調(diào)試技巧(一):快速定位異常的一些方法

.NET程序調(diào)試技巧(一):快速定位異常的一些方法

熱門(mén)標(biāo)簽:集中運(yùn)營(yíng)管理辦法 服務(wù)器配置 地方門(mén)戶網(wǎng)站 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 硅谷的囚徒呼叫中心 阿里云 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化

作為一個(gè)程序員,解BUG是我們工作中常做的工作,甚至可以說(shuō)解決問(wèn)題能力是一個(gè)人工作能力的重要體現(xiàn)。因?yàn)檫@體現(xiàn)了一個(gè)程序員的技術(shù)水平、技術(shù)深度、經(jīng)驗(yàn)等等。

那么在我們解決BUG的過(guò)程中,定位問(wèn)題是非常重要的。有句話叫"發(fā)現(xiàn)問(wèn)題是解決問(wèn)題的一半。

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

一:定位本機(jī)異常

在我們本機(jī)定位異常很容易。假設(shè)我們都是使用的的VisualStudio,那么只需要在調(diào)試->異常菜單中將Common Langeuage Runtime Exception(CLR異常)勾選。如下圖:

                       

在上面的圖片中可以發(fā)現(xiàn)有5種類型的異常,例如c++異常、win32異常等等。對(duì)于.NET程序來(lái)說(shuō)我們只關(guān)注CLR異常。

接下來(lái)進(jìn)行調(diào)試,當(dāng)自己的程序代碼中有異常的時(shí)候,VS就會(huì)自動(dòng)定位到異常的位置。

我們可以看到異常的詳細(xì)信息,并且可在調(diào)用堆棧窗口中看到 程序的堆棧信息。在堆棧信息中我們可以看到在哪個(gè)類、哪個(gè)函數(shù)中出的錯(cuò),如下圖:

 

調(diào)試程序有兩種方式,一種是用VS直接啟動(dòng)程序,另一種是附加到進(jìn)程。

 

 

附加到進(jìn)程的時(shí)候,程序類型不要選錯(cuò)了,我使用的是.net4.0 所以程序類型選擇的是 托管(4.0版)代碼。

另外附加到進(jìn)程有個(gè)快捷鍵是 Ctrl+Alt+P。

但是如果異常不是你的代碼中拋出的,那么如何定位呢?

可以打開(kāi) 調(diào)試 菜單下面的 選項(xiàng)和設(shè)置,將 啟用"僅我的代碼" 這一項(xiàng)取消勾選。那么別人代碼中的異常就可以拋出了。

 

二:在客戶環(huán)境定位.net程序異常:

我們的程序最后都會(huì)運(yùn)行在客戶的環(huán)境中,客戶環(huán)境上不會(huì)有VS這樣的開(kāi)發(fā)工具,那么怎么辦呢?

我們可以使用一個(gè)很小巧的命令行調(diào)試工具M(jìn)dbg.exe,這個(gè)工具是安裝VS的時(shí)候附帶安裝的,僅能調(diào)試.net托管代碼。

Mdbg.exe其實(shí)有很多功能,不過(guò)本文只講它定位異常的功能,后續(xù)文章會(huì)講使用Mdbg.exe單步調(diào)試的方法。

Mdbg.exe命令詳細(xì)介紹可以 輸入 h(help) 或者? 名來(lái)查看,也可以看下面的鏈接,

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

根據(jù)CLR版本的不用,Mdbg.exe也是有多個(gè)版本的。

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

CLR2.0(對(duì)應(yīng)net2.0,3.0,3.5)程序。

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

另外Mdbg.exe有一個(gè)依賴DLL 叫做MdbgCore.dll。我們可以直接將相應(yīng)版本的Mdbg.exe和MdbgCore.dll拷貝到客戶機(jī)器上使用。

沒(méi)有安裝VS的朋友可以拷貝我自己封裝的一個(gè)安裝包 http://xiazai.jb51.net/201506/other/U8DebugSetup.rar,這里面除了Mdbg.exe還有一些其他組件我們后面的文章會(huì)用到。

默認(rèn)會(huì)安裝在 C:\Program Files\U8Debug。

Mdbg.exe的使用方法很加簡(jiǎn),雙擊打開(kāi)它,然后輸入 a(attach,顯示附加的進(jìn)程),回車,這時(shí)會(huì)列表所有可以附加的進(jìn)程。

 

PID 表示進(jìn)程標(biāo)識(shí),

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

這時(shí)程序會(huì)中斷執(zhí)行,我們?cè)谶@個(gè)時(shí)機(jī)可以做一些設(shè)置。讓程序在遇到異常時(shí)自動(dòng)中斷。

輸入命令 ca (catch)查看當(dāng)前調(diào)試器遇到哪些事件會(huì)中斷。

 

可以看到 Exception對(duì)應(yīng)的是Igonre all exception ,也就是忽略所有異常,發(fā)生異常時(shí)不會(huì)中斷。

輸入命令 ca ex 這樣調(diào)試器遇到異常時(shí)就會(huì)中斷了。

再次輸入ca 命令會(huì)看到 Exception對(duì)應(yīng)的值已經(jīng)變?yōu)镾top on all exception了。這時(shí)遇到任何異常都會(huì)中斷了。

 

輸入命令 g 讓程序繼續(xù)執(zhí)行。

當(dāng)遇到異常時(shí)會(huì)自動(dòng)中斷到調(diào)試器,如下圖:

 

入命令 w(where,程序運(yùn)行到哪里了) 可以查看異常堆棧信息

 

三:在客戶環(huán)境定位SilverLight異常

如果客戶的silverlight應(yīng)用服務(wù)器部署在外網(wǎng),那么我們可以直接用瀏覽器訪問(wèn)該silverlight站點(diǎn),然后用VS附加到瀏覽器進(jìn)程來(lái)調(diào)試。

 

調(diào)試方法比調(diào)試普通.net程序一樣。

但是如果,客戶的Silverlight服務(wù)器是部署在內(nèi)網(wǎng),那么你只能在客戶機(jī)器上調(diào)試了。

并且Mdbg.exe也幫不了你了,它不能調(diào)試Silverlight程序。

我們還有另一個(gè)著名的調(diào)試工具Windbg。體積大概有不到20M,很容易安裝到客戶機(jī),安裝包大家可以到網(wǎng)上自己下載。windbg分為32位和64位兩個(gè)版本,

調(diào)試32位的程序請(qǐng)使用32位windbg,反之則要使用64位的windbg,具體為什么我們不用深究,記住了就可以了。

相比Mdbg.exe的小巧實(shí)用,Windbg顯然強(qiáng)大的多,但是使用起來(lái)也復(fù)雜一些。

Windbg其實(shí)可以調(diào)試很多種類型的程序,例如普通.NET程序,c++等。但是本文只講解使用windbg定位異常的方法。

首先我們使用IE瀏覽器打開(kāi)silverlight應(yīng)用程序,然后打開(kāi)windbg附件到IE進(jìn)程來(lái)調(diào)試。附加進(jìn)程的方式可以通過(guò)File菜單下的Attach to a process或者使用F6快捷鍵。

 

附件進(jìn)程后 程序會(huì)中斷到調(diào)試器,這個(gè)時(shí)候我們需要做兩個(gè)設(shè)置。

一個(gè)是 設(shè)置程序發(fā)生異常時(shí)讓其中斷到調(diào)試器,設(shè)置方法是打開(kāi)debug菜單下的Event Filter,將CLR異常設(shè)置其為enable。

 

另外需要加載調(diào)試器擴(kuò)展,使用過(guò)windbg的朋友都知道調(diào)試.net程序需要加載一個(gè)調(diào)試器擴(kuò)展sos.dll。這個(gè)sos.dll也有一個(gè)Silverlight版本的。

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

我們?cè)賑ommand窗口中輸入 .load C:\Program Files (x86)\Microsoft Silverlight\5.1.10411.0\sos.dll 來(lái)加載它。

之后輸入命令 g 來(lái)回復(fù)程序的執(zhí)行。當(dāng)發(fā)生異常時(shí)就會(huì)中斷到調(diào)試器中。

發(fā)生異常是我們可以使用!pe(print exception) 來(lái)查看異常信息。如下圖:

 

如果想查看堆棧信息的話可以輸入命令 !clrstack

通過(guò)上述方法基本可以定位所有的.NET異常。至此,本文結(jié)束。

標(biāo)簽:隨州 威海 開(kāi)封 梧州 甘孜 西雙版納 烏蘭察布 廣西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《.NET程序調(diào)試技巧(一):快速定位異常的一些方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    海安县| 固阳县| 谷城县| 宝清县| 新河县| 德令哈市| 博野县| 甘泉县| 凉城县| 前郭尔| 揭阳市| 北辰区| 岑溪市| 汉沽区| 延川县| 鹤山市| 敦煌市| 宝应县| 麻城市| 宁明县| 望都县| 棋牌| 江阴市| 崇义县| 济宁市| 鹰潭市| 义马市| 灵璧县| 武清区| 凤山市| 沾益县| 内黄县| 射阳县| 玛纳斯县| 叙永县| 寿阳县| 定结县| 阿巴嘎旗| 四会市| 奉节县| 张家川|