溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.Net程序調(diào)試與追蹤的方法有哪些

發(fā)布時(shí)間:2022-01-05 14:52:11 來源:億速云 閱讀:132 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了.Net程序調(diào)試與追蹤的方法有哪些,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

前言

作為一個(gè).net開發(fā)工程師,不管是在寫桌面程序、服務(wù)程序或web程序,在開發(fā)階段,我們必須非常熟悉vs的動(dòng)態(tài)調(diào)試技能,當(dāng)然web程序可能還需要調(diào)試前端的腳本或樣式,這不在本文的討論范圍。本文主要介紹vs的動(dòng)態(tài)調(diào)試基本知識,以及介紹如何追蹤已發(fā)布的程序的調(diào)試日志或技能。

開發(fā)階段

本階段主要以動(dòng)態(tài)調(diào)試為主,調(diào)試的利器當(dāng)然是vs。

動(dòng)態(tài)調(diào)試步驟:

1、擁有程序的代碼和pdb文件;

2、在你要觀察邏輯代碼行號下斷點(diǎn);

3、vs->調(diào)試->開始調(diào)試(你可能需要條件來觸發(fā)讓程序執(zhí)行到你要的邏輯代碼行號);

4、對于已運(yùn)行的程序,你也可以vs->調(diào)試->附加到進(jìn)程 來完成啟動(dòng)調(diào)試,如果已運(yùn)行的程序是服務(wù)進(jìn)程(非桌面進(jìn)程),在附加到進(jìn)程對話框要勾選上“顯示所有用戶的進(jìn)程”;

斷點(diǎn)的條件過濾

在動(dòng)態(tài)調(diào)試中,如果在多線程環(huán)境,一個(gè)斷點(diǎn)斷到之后,如果使用“逐語句”到下語句的話,斷點(diǎn)又會馬上被斷到,造成跟蹤上下文很不方便;還一種情況,在循環(huán)體里下斷,但是只想跟蹤符合一定條件的點(diǎn)。這些時(shí)候,應(yīng)使用條件斷點(diǎn),在某代碼行號下斷,然后右鍵左邊紅色斷點(diǎn)實(shí)圈,彈出的菜單里可以給斷點(diǎn)設(shè)置條件,設(shè)置條件之后的斷點(diǎn),叫條件斷點(diǎn),vs顯示為紅色的虛圈。

生產(chǎn)階段

本階段以追蹤為主,追蹤應(yīng)用程序的日志文件、調(diào)試信息輸出和異常等,不得以的情況下,可以使用遠(yuǎn)程動(dòng)態(tài)調(diào)試來調(diào)試。

日志文件

可能你第一時(shí)間就想到log4net,沒錯(cuò),它可以將一些調(diào)試信息和異常信息寫入文件或db,很方便查詢。除此之外,我們應(yīng)該還要了解 Exceptionless ,它的強(qiáng)大之處在于更完善的異常上下文內(nèi)容收集、異常分類顯示與匯總,在Exceptionless 查看異常信息,幾乎就可以靜態(tài)分析出異常的原因從而直接修改代碼。

 .Net程序調(diào)試與追蹤的方法有哪些

收集調(diào)試信息

由于性能的原因,日志文件里,我們一般只記錄重要的和異常的內(nèi)容,不太重要的產(chǎn)生又頻繁的內(nèi)容,在控制臺的時(shí)候,我們可以使用Console.WriteXXX將這些內(nèi)容實(shí)時(shí)顯示。實(shí)際上,只要調(diào)用 System.Diagnostics.Debugger的Log方法,這個(gè)方法輸出的內(nèi)容,在不調(diào)試的情況下,也可以使用一些工具進(jìn)行捕獲這些輸出內(nèi)容,以下為提供的兩個(gè)收集工具。

1、使用DebugViewer工具進(jìn)行收集

這個(gè)工具是我使用.net來編寫的收集程序,UI很好友,已開源托管在github上面了。

.Net程序調(diào)試與追蹤的方法有哪些

2、使用debugview工具進(jìn)行收集

.Net程序調(diào)試與追蹤的方法有哪些

收集Console.WriteXXX的內(nèi)容

在寫控制臺程序的時(shí)候,Console.WriteXXX能方便我們追蹤,但在非控制臺程序(比如服務(wù)進(jìn)程、windows桌面應(yīng)用和web應(yīng)用),這些Console.WriteXXX實(shí)際上是不產(chǎn)生任何輸出的。現(xiàn)在我們的目標(biāo)是,在非控制臺類型的應(yīng)用,只要調(diào)用了Console.WriteXXX,也能讓收集工具能收集到這些輸出信息。

1、在程序初始化的時(shí)候,替換Console靜態(tài)類的Out屬性,Console.SetOut( debugOut )

2、實(shí)現(xiàn)自己的DebugOut,將Write的內(nèi)容輸出到Debugger.Log方法

public class DebugOut : System.IO.TextWriter
    {       
       public override void Write(char[] buffer, int index, int count)        {            var message = new string(buffer, index, count);            System.Diagnostics.Debugger.Log(0, null, message);        }    }

使用這個(gè)辦法,我可以做到一個(gè)程序,當(dāng)以控制臺服務(wù)時(shí),就輸出到控制到,當(dāng)以服務(wù)進(jìn)程運(yùn)行之后,調(diào)試信息可以被收集工具收到到,而我們的代碼還是調(diào)用Console.WriteXXX。

遠(yuǎn)程動(dòng)態(tài)調(diào)試

希望沒走到這步就可以解決問題,遠(yuǎn)程調(diào)試的要求還是比較高的:

1、遠(yuǎn)程的程序必須帶pdb文件,最好與本機(jī)的代碼是完全一樣的;

2、vs附帶的“遠(yuǎn)程調(diào)試工具”復(fù)制到遠(yuǎn)程機(jī)器上,根據(jù)x86或x64系統(tǒng)運(yùn)行對應(yīng)的調(diào)試服務(wù)端;

3、vs->調(diào)試->附加到進(jìn)程,傳輸為“遠(yuǎn)程(遠(yuǎn)程無身份驗(yàn)證)”,“限定符”為遠(yuǎn)程機(jī)器的ip或域名;

.Net程序調(diào)試與追蹤的方法有哪些

上述內(nèi)容就是.Net程序調(diào)試與追蹤的方法有哪些,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI