1. 程式人生 > >10個用於C#.NET開發的基本除錯工具

10個用於C#.NET開發的基本除錯工具

在除錯軟體時,工具非常重要。獲取正確的工具,然後再除錯時提取正確的資訊。根據獲取的正確的錯誤資訊,可以找到問題的根源所在。找到問題根源所在,你就能夠解決該錯誤了。

你將看到我認為最基本的解決在C# .NET 中錯誤問題的工具的列表。這些將幫助你找到任何難題的根本原因並加以解決。

除了程式碼中的常見問題外,一下工具還可以處理各種問題型別,包括:

  • 效能問題
  • 記憶體問題(GC壓力和記憶體洩漏)
  • 第三方引用庫問題
  • 生產中的問題
  • 網路問題

1、Visual Studio

當涉及除錯時,我們的主要工具就是Visual Studio。它是世界上最好的IDE之一,而不僅僅是在.NET 領域。它具有大量功能來幫助你進行除錯,包括各種工具視窗,異常選項,工具提示等。根據2019年StackOverflow的調查,微軟設法將基本功能和高階功能都整合到一個非常直觀的程式中,是Visual Sudio成為所有開發人員第二受歡迎的IDE。

近年來,出現了兩個競爭對手來挑戰.NET IDE 領域:Rider和Visual Studio Code。根據我的經驗,兩者的除錯功能仍然遠遠落後於Visual Studio。儘管Rider的重構功能和效能令人印象深刻。

除了互動式(傳統)除錯,VS還包括許多其他分析工具:

  • 效能分析
  • 記憶體分析
  • 使用IntelliTrace進行歷史除錯
  • 雲除錯(作為雲探索的一部分)

對於上述所有類別,我更喜歡使用其他工具。繼續進行閱讀,它們都在本次清單中。

2、dnSpy

dnSpy 是用於 .NET 除錯的最有用的工具之一。它是一個很好的反編譯器。但是它的主要用途是作為偵錯程式。dnSpy允許你除錯任何 .NET程式你,而無需考慮符號或者原始碼。

該工具的外觀和感覺類似於Visual Studio。當你開始除錯沒有符號或者原始碼的.NET程序時,dnSpy將向你顯示反編譯的程式碼。現在,這裡有個魔術:你可以在反編譯的程式碼本上中放置斷點。遇到這些斷點時,你將看到區域性變數,執行緒,呼叫堆疊,並具有完整的除錯經驗。這使dnSpy成為除錯第三方程式碼和除錯生產環境的首選工具。

它輕巧,無需安裝。只需將資料夾複製到任何生產機器上,然後開始除錯。

這個工具有個小竅門。如果你使用dnSpy啟動程序,那麼一切將正常執行。但是,如果你附加到正在執行的程序時,則已載入的模組將保持優化狀態。也就是說它們是在Release模式下構建的。優化程式碼後,將不會遇到某些斷點,也不會顯示某些區域性變數。這幾乎破壞了除錯體驗。解決方案是使用dsSpy啟動程序,而不是附加到程序中。

3、dotPeek

dotPeek是JetBrains的免費.NET反編譯器。它們的許多工具實際上進入了該列表。與兩個反編譯器(如ILSpy或JustDecompile)相比,我更喜歡dotPeek,這有兩個原因:

  1. dotPeek提供了更好的使用者體驗。或至少我感到自在。它看起來和感覺都像Resharper。所以這可能是原因。
  2. dotPeek可以從任何程式集中建立符號服務區,即使沒有符號或原始碼也是如此。它像dnSpy一樣,它或反編譯程式碼並從中建立符號。藉助dotPeek,Visual Studio就像dnSpy一樣除錯任何第三方程式碼。要查看準確程度,請參閱我的文章:在Visual Studio中除錯沒有符號的第三方.NET程式碼,後續會進行翻譯。

4、dotTrace

dotTrace是JetBrains的另一個出色工具。這是我最喜歡的效能分析工具。dotTrance允許你“記錄”應用程式的執行,然後分析記錄的效能。你將能夠看到每種呼叫方法花費了多長時間,資料庫條用,HTTP請求以及垃圾回收期間花費的時間等等。

上圖顯示了對Visual Studio的簡短記錄分析。你可以看到ShowWindow花費了155毫秒,其中包括HwndSourceHook(42ms),Convert(16ms)等方法用時。此方法的執行包括42%的WPF呼叫,20%的使用者程式碼,12%的GC等待,10%的Collections程式碼,10%的反射和5%的系統程式碼。太好了吧?

首先,這是一個學習曲線,但是一旦習慣了,它會變得非常直觀。

5、SciTech's .NET Memory Profiler

記憶體分析器是解決記憶體問題必不可少的另一類工具。這些可能是由於GC(GC壓力)引起的記憶體洩露或效能影響。如果你有足夠大的應用程式,那麼遲早會遇到記憶體問題。我希望為你以後著想,因為這些型別的問題可能是毀滅性的。

記憶體探查器可以拍攝“記憶體快照”,並讓你對器進行調查。你將看到哪些物件佔用最多的記憶體,誰引用了它們,以及為什麼未進行垃圾回收。通過比較兩個快照,可以發現記憶體洩露。

有幾種可用的記憶體分析器,但是SciTech's .NET Memory Profiler是我的最愛。我發現它是功能最強大的產品,問題最少。

6、OzCode

OzCode是獨特的Visual Studio擴充套件。其唯一目的是幫助你在Visual Studio中進行互動式除錯。OzCode具有很多功能,可以分為4部分:

1.上方顯示 - OzCode在除錯期間添加了一些有用的視覺化功能。這包括紅色/綠色突出顯示並顯示物件的選定屬性:

還有其他內容,例如將表示式分解成各個部分:

2.LINQ除錯 - LINQ在編寫程式碼時很棒,但是很難除錯。OzCode允許在除錯過程中以幾乎完美的方式研究LINQ表示式。

要了解有關使用或不使用OzCode除錯LINQ的更多資訊,請檢視我的文章:如何在C#中除錯LINQ查詢。

3.資料提示 - 資料提示是將滑鼠懸停在Visual Studio中的變數上時看到的彈出視窗。OzCode用自己的更好的資料提示替換了該視窗。它允許“收藏夾”屬性,搜尋,匯出為JSON和其他功能。

4.時間穿梭 - OzCode 4 添加了新的革命性除錯功能。它可以預測未來而無需移動斷點。也就是說,你將能夠看到當前除錯位置之後發生的程式碼行中發生的情況。不過,此功能並非在所有情況下都有效。例如,OzCode無法預測HTTP請求結果或SQL請求之類的事情,因為它必須為此執行它們。

7、SysInternals Suite

SysInternals是一套用於對Windows軟體進行故障排除和監視的實用程式。它包括一些我們除錯所需的最重要的工具。我建議下載整個套件並將其儲存在易於命令列鍵入的位置,例如:C:\Sysinternals。有很多工具,其中一些比其他工具更有用。讓我們列出一些.NET最重要的。

Process Explorer

Process Explorer就像類固醇上的Windows Task Manager。它具有許多對除錯有用的功能,這裡是其中的一些:

  • 檢視載入的模組
  • 檢視控制代碼
  • 建立Dump
  • 檢視程序樹
  • 檢視效能計數器

Process Monitor

Process Monitor 也稱為ProcMon,允許你監視流程活動事件。具體的說,你可以彈道登錄檔事件,檔案事件,網路事件,執行緒活動和效能分析事件。如果你想找出你的過程涉及哪些檔案或登錄檔,那麼ProcMon可以為你提供幫助。

ProcDump

ProcDump是用於儲存轉儲檔案的命令列工具。它可以立即或在觸發器上生成轉儲。例如,在崩潰或掛起時建立轉儲。這是我推薦的用於捕獲轉儲的工具。以下是它的一些功能:

  • 立即建立轉儲
  • 建立具有特定間隔的多個轉儲(例如3個轉儲,相隔5秒)
  • 一旦超過CPU閾值,就建立轉儲
  • 如果程序掛起,則建立轉儲
  • 崩潰時建立轉儲

若要查詢有關ProcDump和Dump的更多資訊,請參閱我的文章:2019年如果建立、使用和除錯.NET 應用程式崩潰轉儲。

8、Performance Monitor (PerfMon)

Windows中有一種稱為“效能計數器”的內建機制。這些計數器可讓你根據計算機上發生的事情跟蹤大量有用的指標。這些可能是系統範圍內的指標,也可能是針對特定過程的指標。以下是一些可以使用效能計數器衡量的事情的示例:

  • CPU使用率
  • 記憶體使用率
  • 程序中引發的異常數
  • I/O位元組的讀寫
  • 對你的asp.net應用程式的請求數
  • 在asp.net應用程式中請求響應時間

你可能會監視成千上萬種不同的計數器,它們會盡可能的具體。例如,如果你想了解程序的記憶體使用情況,則有以下計數器:私有位元組,虛擬位元組,工作集,私有工作集,Gen X 集合,GC時間百分比,大物件堆大小 等等。

效能監視器是使你可以直觀地看到這些計數器的工具(儘管也有其他工具)。它以在Windows裝置預安裝上了。要執行它,只需要在開始選單中鍵入“Performance Monitor”,或在命令提示符下鍵入perfmon

9、PerfView

PerfView是一個開源通用分析工具。它可以做很多事情,以下是其中一些:

  • 效能分析
  • 記憶體分析
  • 分析ETW事件
  • 從Linux匯入效能快照
  • 有關應用程式行為的各種報告,包括JIT編譯時間,垃圾回收時間等

它的分析是基於Windows事件跟蹤(ETW)事件。這是一個內建的日誌記錄系統,執行速度非常快,Windows的每個部分都可以使用它。一切都將事件記錄到ETW,包括核心,Windows作業系統,CLR執行時,IIS,ASP.NEt框架,WPF等。

PerfView很容易成為此列表中最複雜的工具。但是它也非常強大。要開始使用PerfView,我建議在第九頻道觀看Vance Morrison的視訊課程系統。

10、Fiddler

Fiddler是Progress Telerik的免費工具。這是我最喜歡的網路請求除錯工具之一。它被稱為HTTP代理伺服器,僅此而已。它捕獲所有HTTP請求,記錄資料,並按其方式傳送請求。

對於每一個請求,你都可以檢視流程,Headers,payload,response,status等所有的內容。

對於除錯,Fiddler具有兩個有用功能:

  • 重新請求 - 你可以右鍵單擊任何請求,然後單擊“Replay”,這將再次傳送完全相同的請求。在除錯伺服器端問題時非常有用。如果你要重現有問題的請求,Fiddler可以避免在客戶端上重新執行方案以再次傳送相同請求的麻煩。它還有助於處理難以重現的請求。
  • 編輯並重新請求 - 除了重新請求外,Fiddler允許我們修改請求。你可以更改標題,正文,甚至URL本身。你可以使用它來檢視伺服器端如何處理極端情況。或重現特定請求上發生的問題。

哪一個沒有提到

你可能會想知道我未提及的某些工具,如果你已經做開發很長時間了,你可能會想到WinDbg。如果你不熟悉WinDbg,它是一個命令列偵錯程式,曾經是Windows的主要除錯工具。有點像現在的Visual Studio用於.NET。我覺得這在2020年以及以後並不重要。至少不適用於.NET開發。你可以使用Visual Studio進行幾乎所有操作,並且它將變得越來越容易和快捷。

WinDbg的某些功能仍然是好的。像它的指令碼功能一樣,易於遠端處理和方便的生產除錯。你可以將WinDbg複製到生產計算機上,並快速調查轉儲檔案。它不需要像Visual Studio這樣的大型安裝。但是我總是發現自己將轉儲檔案複製到我的開發機器上,並使用記憶體分析器或者Visual Studio開啟它們。這樣更加有效。因此,我認為WinDbg不再是.NET開發所必需的除錯工具。

總結

我們介紹了一些最佳的除錯工具。我認為,瞭解這些工具對於成為高階開發人員至關重要。其中提到了一些可以用其類別中的類似工具代替。例如,你可以將dotMemory用作記憶體分析器,Visual Studio的內建分析器甚至PrefView。或者你可以使用RedGate的效能分析器來代替dotTrace。

無論你選擇什麼,都至少知道一個性能分析器可以幫助你解決本來會遇到的難題。記憶體分析器、生產除錯工具(如dnSpy),反編譯器以及其餘的工具也是如此。

祝大家除錯愉快!!!