如何调试Windows应用商店应用中的内存泄漏?

时间:2012-12-05 19:00:40

标签: .net windows-8 profiling windows-runtime windows-store

所以我有一个泄漏内存的.NET Windows应用商店应用。我能做些什么呢?我用于jetBrains或Red-Gate / ANTS的桌面应用程序的探查器工具不支持Metro应用程序(或现在是否支持?)

2 个答案:

答案 0 :(得分:12)

对于最简单的方法 - 跳到底部阅读有关使用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

实时调试对我来说不起作用,因为当您附加调试器时应用程序似乎被暂停。我想我在某个地方看到了一个让应用程序保留在内存中的选项,但是我忘了在哪里,但是对于内存分析 - 查看静态转储文件可能已经足够了。


您可以从here下载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的.NET Memory Allocation Profiling with Visual Studio 2012所述 - PerfView工具支持分析.NET Windows应用商店应用中的泄漏。查看Vance Morrison here的文章和视频演练。


*编辑2

Visual Studio 2013 Preview添加了一个新选项,用于分析转储文件中的托管内存堆。要做到这一点 - 只需在Visual Studio调试器中暂停您的应用程序,通过Debug / Save Dump As保存当前转储,然后恢复执行并使用您的应用程序,直到您的疑似泄漏发生并再次进行转储。然后转到文件/打开/文件并打开第二个转储文件。在“操作”面板的“转储摘要”右侧,您将看到“调试管理内存”操作。选择该项,然后在“选择基准”中选择您的第一个转储文件。您将在托管堆上看到按类型分组的对象列表,其中包含计数差异。请注意,您通常会先查看具有低,非零计数差异的对象,以跟踪单个泄漏源。您可以通过在参考图形视图中展开树来深入查看对象列表并查看将它们保留在内存中的内容。

答案 1 :(得分:1)