簡體   English   中英

如何在C#程序中使用SOS.dll進行自動調試?

[英]How can I use SOS.dll within a C# program for automated debugging purposes?

為了追蹤內存泄漏,我一直在使用Visual Studio和SOS.dll來提供對象堆的轉儲,並查看GCR射擊特定對象的原因。

我開始使用AutoIt自動執行此過程來控制我的鼠標和鍵盤。 這是我腳本第一部分的近似值:

在Visual Studio中,按F5開始執行
讓程序完全加載
切換到Visual Studio並中斷執行

將焦點切換到即時窗口
加載SOS.dll
打電話!dumpheap -stat
將轉儲結果復制到剪貼板
粘貼在記事本中並保存為dump1.txt

繼續執行
多次執行泄漏操作
切換到Visual Studio並中斷執行

將焦點切換到即時窗口
清除輸出
打電話!dumpheap -stat
將轉儲結果復制到剪貼板
粘貼在記事本中並保存為dump2.txt

運行Python腳本,比較兩個轉儲並找到泄漏的對象

不過,我對目前的方法有些擔憂。 我不僅依賴於Visual Studio的安裝,而且在腳本運行時,我不能使用鼠標或鍵盤而不會使自動化失序。

有沒有辦法在C#程序而不是Visual Studio中使用SOS.dll? 理想情況下,此解決方案將附加到指定的進程,並將!dumpheap -stat的結果輸出到文本文件,而無需自動化Visual Studio。

下面我將介紹一些可用於查找泄漏的不同方法。

(如果您不希望遵循DIY方法,可以使用商業“泄漏”探測器)。

鏈接到我的回答詳細說明了許多調試工具/資源

將SOS.DLL加載到WinDBG中

實際上你不需要Visual Studio來使用SOS.DLL ....它是一個調試器擴展,所以也可以在WinDBG中使用。

您可以免費獲得WinDBG調試器作為Windows調試工具的一部分。

然后,您可以編寫WinDBG腳本來自動執行“轉儲”。

另外請注意,SOS.DLL的增強版本可用...尋找SOSEX,PSSCOR2(針對NET 2)和PSSCOR4(針對NET 4)。

CLR性能分析API

您可以使用CLR Profiling API。

有一個名為CLRProfiler的應用程序,它是一個實際的.NET分析器,它使用它....所以有很多代碼可以看看它是如何使用的。

CLR Profiler可以做的事情之一是允許進行堆轉儲,然后比較在不同時間段進行的轉儲,以找出差異......從而幫助發現泄漏。

在“測試”模式下(嵌入在應用程序中,或作為監視它的配套實用程序),您可以為應用程序提供類似的功能。

流程轉儲

您可以使用的另一種技術是定期對您的進程進行“轉儲”,然后您可以通過WinDBG使用SOS / SOSEX(或任何其他WinDBG插件)離線分析。

您可以使用DebugDiag(您可以設置規則和操作來控制何時創建.dmp文件)以自動創建.dmp文件....或者名為ProcDump.exe的工具(來自SysInternals)。

ProcDump特別有用,因為它能夠非常快速地獲取“過程快照”,因為它使用了一種稱為“過程反射”的技術....這使得您的過程可以不那么積極地中斷,例如

(創建3個轉儲,每個轉儲間隔5秒)

procdump -s 5 -n 3 notepad.exe notepad.dmp 

死后分析

擁有一組.dmp文件后,您可以分析它們以查找泄漏,監視句柄使用情況等。

您可以在WinDBG中手動加載.dmp文件然后發出調試器命令,或者您可以編寫一個WinDBG擴展或者一個腳本來獲取轉儲文件並依次處理它們(即對它們運行!dumpheap stat命令) 。

Debug Analyzer .NET

這是一個旨在分析.dmp文件和進行事后分析的工具。

它允許您在.NET中編寫腳本,因此可能比WinDBG更容易訪問。

如果你想擴展它,它還有一個插件模型。

它允許您編寫/使用展示台以獨特的方式查看數據。

(目前僅支持CLR 2.0內存轉儲......不支持CLR 4.0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM