如何在Windows商店应用程序中调试内存泄漏?

8

我有一个.NET Windows Store应用程序存在内存泄漏问题。该怎么办?我使用的JetBrains或Red-Gate/ANTS桌面应用程序的分析工具不支持Metro应用(现在是否支持了呢?)

2个回答

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架构的,特别是在运行于Windows x64版本时 - 您需要使用调试器的x86版本(WinDbg提供两个版本)来保存转储文件。用于WinDbg的托管内存调试扩展SOS不支持调试x86位处理器的x64位转储文件。因此,您还需要相应地更新sos路径,使其如下所示:
.load C:\windows\Microsoft.NET\Framework\v4.0.30319\sos.dll

可能并非所有这些命令都是必需的,但这就是对我有效的。

现在您可以找到似乎存在太多实例的对象类型。

!DumpHeap -type TypeName

其中类型名称只是类型的名称 - 不需要完全限定的命名空间。

现在,您可以检查是什么将此对象保留在内存中:

!GCRoot Object_Address

实时调试对我不起作用,因为当您连接调试器时,应用程序似乎会被暂停。我想我在某个地方看到过一个选项使应用程序保持在内存中,但我忘记了在哪里,但对于内存分析-查看静态转储文件可能足够了。
你可以从这里下载Windows SDK或作为“Windows调试工具”的独立下载获取WinDbg。
要创建转储文件-进入任务管理器,右键单击一个进程并选择“创建转储文件”。

一些更多的链接:

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内存分配分析》PerfView工具支持分析.NET Windows Store应用程序中的泄漏问题。在这里查看与Vance Morrison的文章和视频演示
Visual Studio 2013 Preview增加了一种新的选项,可以从转储文件中分析托管内存堆。要做到这一点-只需在Visual Studio调试器中暂停您的应用程序,通过Debug/Save Dump As保存当前转储,然后恢复执行并使用您的应用程序,直到发生疑似泄漏并再次转储。然后转到File/Open/File并打开第二个转储文件。在“操作”面板中的Dump Summary右侧,您将看到一个“Debug Managed Memory”操作。选择它,然后在“Select Baseline”中选择您的第一个dump文件。您将看到托管堆上的对象列表,按类型分组,带有计数差异。请注意,通常首先查看具有低非零计数差异的对象以跟踪单个泄漏源。您可以深入了解对象列表,并通过在Reference Graph视图中展开树来查看它们在内存中的保留情况。

更多新鲜的链接:http://blogs.microsoft.co.il/blogs/sasha/archive/2012/10/15/diagnosing-memory-leaks-in-managed-windows-store-apps.aspx - Filip Skakun
似乎使用wpr(Windows性能记录器)命令生成并使用wpa(Windows性能分析器)读取的etl(事件跟踪日志)文件可以帮助找到泄漏问题,但我还没有尝试过。请查看以下链接,其中可能包含一些有用的信息:http://www.idigitalhouse.com/Blog/?p=155 http://blogs.msdn.com/b/ntdebugging/archive/2012/11/30/troubleshooting-pool-leaks-part-7-windows-performance-toolkit.aspx - Filip Skakun
1
请注意,“调试托管内存”选项仅适用于Visual Studio 2013旗舰版,并且转储是从.NET 4.5进程创建的。更多信息请参见此处:http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/20/using-visual-studio-2013-to-diagnose-net-memory-issues-in-production.aspx - Lars Udengaard

1

谢谢!我得试试看! - Filip Skakun
1
他们在推特上向我表明该工具仅支持追踪托管方面的事物,但对许多人来说这应该足够了。 - Filip Skakun
这个问题被标记为 .net,所以我忘了提到它在最新版本的 WinJS 中不起作用。我不会感到惊讶如果在某个时候能够看到它。 - kodefuguru
你必须在回答中披露你的隶属关系。http://stackoverflow.com/help/promotion - Alex Angas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接