如何調試 Windows Store 應用程序中的記憶體洩漏?
所以我有一個 .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://msdn.microsoft.com/en-us/library/bb190764.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 保存您目前的轉儲,然後恢復執行並使用您的應用程序,直到您懷疑發生洩漏並執行另一個轉儲。然後轉到文件/打開/文件並打開第二個轉儲文件。在“操作”面板中轉儲摘要的右側,您將看到“調試託管記憶體”操作。選擇它,然後在“選擇基線”中選擇您的第一個轉儲文件。您將看到託管堆上的對象列表,按類型分組,具有計數差異。請注意,您通常會首先查看具有低、非零計數差異的對像以跟踪單個洩漏源。