1. 程式人生 > >.Net程序調試與追蹤的一些方法

.Net程序調試與追蹤的一些方法

sage 信息 rdquo system 知識 display isp 控制 lan

前言

作為一個.net開發工程師,不管是在寫桌面程序、服務程序或web程序,在開發階段,我們必須非常熟悉vs的動態調試技能,當然web程序可能還需要調試前端的腳本或樣式,這不在本文的討論範圍。本文主要介紹vs的動態調試基本知識,以及介紹如何追蹤已發布的程序的調試日誌或技能。

開發階段

本階段主要以動態調試為主,調試的利器當然是vs。

動態調試步驟:

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

2、在你要觀察邏輯代碼行號下斷點;

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

4、對於已運行的程序,你也可以vs->調試->附加到進程 來完成啟動調試,如果已運行的程序是服務進程(非桌面進程),在附加到進程對話框要勾選上“顯示所有用戶的進程”;

斷點的條件過濾

在動態調試中,如果在多線程環境,一個斷點斷到之後,如果使用“逐語句”到下語句的話,斷點又會馬上被斷到,造成跟蹤上下文很不方便;還一種情況,在循環體裏下斷,但是只想跟蹤符合一定條件的點。這些時候,應使用條件斷點,在某代碼行號下斷,然後右鍵左邊紅色斷點實圈,彈出的菜單裏可以給斷點設置條件,設置條件之後的斷點,叫條件斷點,vs顯示為紅色的虛圈。

生產階段

本階段以追蹤為主,追蹤應用程序的日誌文件、調試信息輸出和異常等,不得以的情況下,可以使用遠程動態調試來調試。

日誌文件

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

收集調試信息

由於性能的原因,日誌文件裏,我們一般只記錄重要的和異常的內容,不太重要的產生又頻繁的內容,在控制臺的時候,我們可以使用Console.WriteXXX將這些內容實時顯示。實際上,只要調用 System.Diagnostics.Debugger的Log方法,這個方法輸出的內容,在不調試的情況下,也可以使用一些工具進行捕獲這些輸出內容,以下為提供的兩個收集工具。

1、使用DebugViewer工具進行收集

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

技術分享

2、使用debugview工具進行收集

技術分享

收集Console.WriteXXX的內容

在寫控制臺程序的時候,Console.WriteXXX能方便我們追蹤,但在非控制臺程序(比如服務進程、windows桌面應用和web應用),這些Console.WriteXXX實際上是不產生任何輸出的。現在我們的目標是,在非控制臺類型的應用,只要調用了Console.WriteXXX,也能讓收集工具能收集到這些輸出信息。

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

2、實現自己的DebugOut,將Write的內容輸出到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);
        }
    }
DebugOut

使用這個辦法,我可以做到一個程序,當以控制臺服務時,就輸出到控制到,當以服務進程運行之後,調試信息可以被收集工具收到到,而我們的代碼還是調用Console.WriteXXX。

遠程動態調試

希望沒走到這步就可以解決問題,遠程調試的要求還是比較高的:

1、遠程的程序必須帶pdb文件,最好與本機的代碼是完全一樣的;

2、vs附帶的“遠程調試工具”復制到遠程機器上,根據x86或x64系統運行對應的調試服務端;

3、vs->調試->附加到進程,傳輸為“遠程(遠程無身份驗證)”,“限定符”為遠程機器的ip或域名;

技術分享

結束

以上是個人現在常用的調試與追蹤方法,你也可以把你的其它好點子分享分享。

.Net程序調試與追蹤的一些方法