![](/img/trans.png)
[英]SOS.dll ObjSize and DumpObject under the hood intricacies. How to recreate SOS.dll in C#?
[英]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方法,可以使用商業“泄漏”探測器)。
實際上你不需要Visual Studio來使用SOS.DLL ....它是一個調試器擴展,所以也可以在WinDBG中使用。
您可以免費獲得WinDBG調試器作為Windows調試工具的一部分。
然后,您可以編寫WinDBG腳本來自動執行“轉儲”。
另外請注意,SOS.DLL的增強版本可用...尋找SOSEX,PSSCOR2(針對NET 2)和PSSCOR4(針對NET 4)。
您可以使用CLR Profiling API。
有一個名為CLRProfiler的應用程序,它是一個實際的.NET分析器,它使用它....所以有很多代碼可以看看它是如何使用的。
CLR Profiler可以做的事情之一是允許進行堆轉儲,然后比較在不同時間段進行的轉儲,以找出差異......從而幫助發現泄漏。
在“測試”模式下(嵌入在應用程序中,或作為監視它的配套實用程序),您可以為應用程序提供類似的功能。
您可以使用的另一種技術是定期對您的進程進行“轉儲”,然后您可以通過WinDBG使用SOS / SOSEX(或任何其他WinDBG插件)離線分析。
您可以使用DebugDiag(您可以設置規則和操作來控制何時創建.dmp文件)以自動創建.dmp文件....或者名為ProcDump.exe的工具(來自SysInternals)。
http://www.microsoft.com/en-us/download/details.aspx?id=26798
http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
ProcDump特別有用,因為它能夠非常快速地獲取“過程快照”,因為它使用了一種稱為“過程反射”的技術....這使得您的過程可以不那么積極地中斷,例如
(創建3個轉儲,每個轉儲間隔5秒)
procdump -s 5 -n 3 notepad.exe notepad.dmp
擁有一組.dmp文件后,您可以分析它們以查找泄漏,監視句柄使用情況等。
您可以在WinDBG中手動加載.dmp文件然后發出調試器命令,或者您可以編寫一個WinDBG擴展或者一個腳本來獲取轉儲文件並依次處理它們(即對它們運行!dumpheap stat命令) 。
這是一個旨在分析.dmp文件和進行事后分析的工具。
它允許您在.NET中編寫腳本,因此可能比WinDBG更容易訪問。
如果你想擴展它,它還有一個插件模型。
它允許您編寫/使用展示台以獨特的方式查看數據。
(目前僅支持CLR 2.0內存轉儲......不支持CLR 4.0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.