.Net程序调试与追踪的一些方法
前言
作為一個.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 override void Write(char[] buffer, int index, int count){ ? ? ? ? ? ?var message = new string(buffer, index, count);System.Diagnostics.Debugger.Log(0, null, message);}}
使用這個辦法,我可以做到一個程序,當以控制臺服務時,就輸出到控制到,當以服務進程運行之后,調試信息可以被收集工具收到到,而我們的代碼還是調用Console.WriteXXX。
?
遠程動態調試
希望沒走到這步就可以解決問題,遠程調試的要求還是比較高的:
1、遠程的程序必須帶pdb文件,最好與本機的代碼是完全一樣的;
2、vs附帶的“遠程調試工具”復制到遠程機器上,根據x86或x64系統運行對應的調試服務端;
3、vs->調試->附加到進程,傳輸為“遠程(遠程無身份驗證)”,“限定符”為遠程機器的ip或域名;
?
結束
以上是個人現在常用的調試與追蹤方法,你也可以把你的其它好點子分享分享。
原文地址:http://www.cnblogs.com/kewei/p/7096905.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的.Net程序调试与追踪的一些方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 2.0 Previe
- 下一篇: RabbitMQ系列教程之一:我们从最简