【问题标题】:Analyzing memory dump to find leak分析内存转储以发现泄漏
【发布时间】:2013-10-31 14:04:46
【问题描述】:

我们有一个存在内存泄漏的 c# .NET 应用程序。我使用 procdump 从生产机器上运行的应用程序实例中获取内存转储。生产机器运行 32 位 Windows XP 和 .NET 4.0。

exe 配置设置为 .net 4.0

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />

当我将转储拉到我的开发框 Windows 8.1 64bit 并使用 VS 2013 打开它时,转储最初打开正常。但是,当我单击 Debug Managed Memory 操作时,我收到以下错误消息:

此过程中使用的 CLR 版本不支持内存分析。

我是 Windows 和托管内存环境中的内存泄漏故障排除新手,对所涉及的工具几乎一无所知。我对我得到的错误进行了谷歌搜索,但没有找到任何东西。任何帮助表示赞赏。如果我遗漏了一些明显的东西,我深表歉意 - 初级开发人员:-)

【问题讨论】:

  • 你有什么证据表明存在内存泄漏?
  • "收集转储文件的进程必须在 .NET 4.5 或更高版本上运行。" - 见this

标签: c# memory-leaks visual-studio-2013


【解决方案1】:

我不知道是否可以使用 procdump 来查找 .NET 中的内存泄漏。我尝试过的一种有效方法是:使用 Windbg 和 SOS。有两篇文章解释了如何使用 Windbg+ SOS 来跟踪 .NET 内存泄漏:

  1. Where's your leak at? [Using WinDbg, SOS, and GCRoot to diagnose a .NET memory leak]
  2. Debugging managed code memory leak with memory dump using windbg

如果你不喜欢 Windbg,工具DebugDiag 也是非常有效的追踪内存泄漏的工具。

【讨论】:

    【解决方案2】:

    看到这个link,它只适用于在.Net 4.5下运行的进程

    在开始之前,关于“调试 本文讨论的“托管内存”功能:

    1. 该选项仅在转储摘要页面中可用 Visual Studio 2013 的终极版。如果您使用的是 Premium 或 专业的你不会看到选项
    2. 收集转储文件的进程必须在 .NET 4.5 或更高版本上运行。如果转储是在 3.5 或 以前的选项不会出现,如果它是在 4.0 上收集的 将无法启动并显示错误消息。

    【讨论】:

      【解决方案3】:

      从 Windows 7 /Server 2008 R2 开始,有一种方法可以创建进程的克隆并创建此克隆的转储,这样您关心的进程就不需要暂停。捕获转储时使用 procdump -r 使用此功能。

      您还可以使用捕获 ETW 跟踪并使用 PerfView 分析数据。

      https://superuser.com/questions/846079/how-can-i-create-a-memory-dump-of-a-production-system-without-affecting-performa/846156#846156

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        相关资源
        最近更新 更多