Dot-Net

如何調試 Windows Store 應用程序中的記憶體洩漏?

  • July 19, 2013

所以我有一個 .NET Windows Store 應用程序正在洩漏記憶體。我能做些什麼呢?我用於 jetBrains 或 Red-Gate/ANTS 桌面應用程序的分析器工具不支持 Metro 應用程序(或者現在支持嗎?)

對於最簡單的方法 - 跳到底部閱讀有關使用 Visual Studio 2013 執行此操作的說明。


現在可能會有一些新工具——也許是更新後的 Visual Studio 中的一些東西,我很想找到這些工具,但我之前嘗試過WinDbg並取得了一些成功。這是我關於如何做到這一點的舊筆記:

1. Create dump file from process manager
2. Run WinDbg (X64)
3. File/Open Crash Dump… (Crtl+D)
4. Run following:

lm
.load C:\windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
.sympath SRV*c:\localsymbols*http://msdl.microsoft.com/download/symbols
.symfix
.reload
!dumpheap -stat

請注意,如果您的程序是 x86,特別是如果您在 x64 版本的 Windows 上執行 - 您將需要使用 x86 版本的調試器(WinDbg 提供兩個版本)來保存轉儲。SOS 是 WinDbg 的託管記憶體調試擴展,不支持調試 x86 位程序的 x64 位轉儲。然後,您還需要分別更新 sos 路徑,如下所示:

.load C:\windows\Microsoft.NET\Framework\v4.0.30319\sos.dll

可能並非所有這些命令都是必需的,但這對我有用。

現在您可以找到似乎存在於太多實例中的對象的類型

!DumpHeap -type TypeName

其中 type name 只是類型的名稱 - 不需要完全限定的命名空間。

現在你可以檢查是什麼讓這個對像在記憶體中:

!GCRoot Object_Address

實時調試對我不起作用,因為當您附加調試器時應用程序似乎暫停了。我想我在某個地方看到了一個讓應用程序留在記憶體中的選項,但我忘記了在哪裡,但是對於記憶體分析 - 查看靜態轉儲文件可能就足夠了。


您可以從此處下載 WinDbg 作為 Windows SDK 的一部分或作為“Windows 調試工具”的獨立下載。

要創建轉儲文件 - 轉到任務管理器,右鍵點擊程序並選擇“創建轉儲文件”。


更多連結:

http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/15/diagnosing-memory-leaks-in-managed-windows-store-apps.aspx

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/f3a3faa3-f1b3-4348-944c-43f11c339423

http://msdn.microsoft.com/en-us/library/bb190764.aspx

http://blogs.msdn.com/b/dougste/archive/2009/02/18/failed-to-load-data-access-dll-0x80004005-or-what-is-mscordacwks-dll.aspx


*編輯

根據Stephen Toub使用 Visual Studio 2012 進行的 .NET Memory Allocation Profiling - PerfView工具支持分析 .NET Windows Store 應用程序中的洩漏。在此處查看Vance Morrison 的文章和影片演練。


*編輯 2

Visual Studio 2013 Preview 添加了一個新選項來分析轉儲文件中的託管記憶體堆。要做到這一點 - 只需在 Visual Studio 調試器中暫停您的應用程序,通過 Debug/Save Dump As 保存您目前的轉儲,然後恢復執行並使用您的應用程序,直到您懷疑發生洩漏並執行另一個轉儲。然後轉到文件/打開/文件並打開第二個轉儲文件。在“操作”面板中轉儲摘要的右側,您將看到“調試託管記憶體”操作。選擇它,然後在“選擇基線”中選擇您的第一個轉儲文件。您將看到託管堆上的對象列表,按類型分組,具有計數差異。請注意,您通常會首先查看具有低、非零計數差異的對像以跟踪單個洩漏源。

引用自:https://stackoverflow.com/questions/13730496