【问题标题】:How to debug memory leaks in Windows Store apps?如何调试 Windows 应用商店应用程序中的内存泄漏?
【发布时间】:2012-11-23 16:58:57
【问题描述】:

所以我有一个 .NET Windows Store 应用程序正在泄漏内存。我能做些什么呢?我用于 jetBrains 或 Red-Gate/ANTS 桌面应用程序的分析器工具不支持 Metro 应用程序(或者现在支持吗?)

【问题讨论】:

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


    【解决方案1】:

    对于最简单的方法 - 跳到底部阅读有关使用 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 的一部分下载,也可以从 here 单独下载“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 Store 应用程序中的漏洞。查看 Vance Morrison here 的文章和视频演练。


    *编辑 2

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

    【讨论】:

    【解决方案2】:

    Telerik JustTrace 支持 Windows 应用商店应用:http://www.telerik.com/products/memory-performance-profiler/justtrace-features.aspx

    【讨论】:

    • 谢谢!我得试试看!
    • 他们在推特上说它只支持跟踪事物的托管方面,但这对很多人来说应该足够了。
    • 这个问题被标记为 .net,所以我忘了提到它在 WinJS 中不起作用(在最新版本中)。在某些时候看到它我不会感到惊讶。
    • 您必须在回答中披露您的隶属关系。 stackoverflow.com/help/promotion
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多