【问题标题】:Finding memory leaks in a managed Win8 metro app?在托管的 Win8 Metro 应用程序中查找内存泄漏?
【发布时间】:2012-04-17 05:15:44
【问题描述】:

我目前正在使用 C# 和 SharpDX 为 Windows 8 开发地铁游戏。该项目进展顺利,但最近需要开始追踪内存泄漏,我不确定从哪里开始。

Visual Studio 11 中的内置内存分析器不适用于 Metro 应用程序,WinDBG 似乎无法连接到 Metro 应用程序(除非我使用不正确),而且我很难找到有关在 Metro 的 .NET 4.5 中查看托管分配的任何信息。

有人有这方面的经验吗?有什么好的地方可以开始寻找吗?有没有人成功使用工具来帮助检测 Metro 应用程序中的内存泄漏?

【问题讨论】:

  • 我还不会花很多时间在这上面。 WinRT 本身存在将在 RTM 之前修复的内存泄漏的可能性很大。您将花费大量时间来解决临时问题。到时候也应该有工具支持。
  • 您最好通过应用程序验证程序运行它。您可以通过商店发布使用 SlimDX 的应用程序的几率应该是 Slim。
  • @HansPassant - 我同意。他可能想验证他甚至可以将它发布到商店,我的理解是,除非 SharpDX 只使用 WinRT 配置文件,否则它被发布的机会微乎其微。查看 SharpDX 的项目页面,他们列出的“功能”会让你相信它通过使用“Metro Style”这个词来支持 WinRT 配置文件,甚至微软自己的产品也只是意味着某种设计风格。当然,截至 2012 年 3 月 30 日,SharpDX 甚至不支持 Windows 8 CP。
  • 到目前为止,SharpDX的夜间构建确实在Win8 CP的WACK套件下构建并通过了验证。我知道微软自己的一些 pre-RTM 代码中可能存在内存泄漏,但我真的只是在寻找有关我分配的信息。甚至 System.GC.GetTotalMemory() 对于 Metro 应用程序似乎都不存在。我不想把我的搜索推迟太久,否则我担心我会在 RTM 之后花时间做这件事,这可能会阻碍项目。
  • @BenSmith - 在 Windows 8 RC 发布之前,您将不得不以老式方式进行操作。确定泄漏的位置,确保以正确的方式进行所有操作,并等待 Visual Studio 内存配置文件功能支持 WinRT 配置文件。

标签: c# memory-management windows-8 managed microsoft-metro


【解决方案1】:

看起来我实际上可以使用 WinDbg,它只是无法使用侵入模式。我的错。

【讨论】:

    【解决方案2】:

    至少现在我会假设内存泄漏不是由 Metro 或 SharpDX 引起的。

    检查一下: Memory Leaks C#

    (或者只是搜索“C#内存泄漏”。)

    一旦您浏览了从上述链接/搜索查询中收集到的清单,然后继续检查与 SharpDX/Metro 相关的代码。最好的指导方针来自我年轻时的妈妈:“玩完后自己收拾干净。”处理完对象后处理它们,不要让数据库、文件或内存流打开的时间超过你需要的时间。这就是很多人出现内存泄漏问题的原因,包括我的。

    【讨论】:

    • 我一直在与常见的嫌疑人(流、IDisposables、事件)打交道,但我更多的是寻找可以让我深入了解当前分配的任何工具或功能。即使只是能够获得托管分配的列表,也能极大地帮助找到真正的问题区域。
    【解决方案3】:

    我建议你使用这个http://msdn.microsoft.com/en-us/magazine/jj721593.aspx。关于内存泄漏的解释很多。

    【讨论】:

    • 不要仅仅发布一个链接(评论会更好),您至少应该指出该文章中讨论的技术的一些亮点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2012-01-30
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多