【问题标题】:How can I create memory dumps and analyze memory leaks?如何创建内存转储和分析内存泄漏?
【发布时间】:2009-11-11 00:39:12
【问题描述】:

我需要获取以下信息来分析内存泄漏问题。该怎么做?

  • 孤立块地址孤立呼叫
  • 堆栈

是否有任何好的资源/工具可以了解/修复内存泄漏。

谢谢

【问题讨论】:

  • Valgrind 经常被提及用于分析和捕获内存泄漏。

标签: c++ memory-leaks


【解决方案1】:

如果您使用的是 linux,请使用 valgrind。这是你最好的新朋友。我不确定哪些工具适用于 Windows。

【讨论】:

    【解决方案2】:

    valgrind --leak-check=full

    【讨论】:

      【解决方案3】:

      如果您在 Windows 平台上,Microsoft Application Verifier 会执行类似于 valgrind 的内存分析。

      【讨论】:

        【解决方案4】:

        在 Windows 中,您可以使用 dbghelp.dll 中的 MiniDumpWriteDump 函数。

        How to create minidump for my process when it crashes?

        这对于跟踪已部署应用程序中的错误非常有帮助,因为您可以使用调试符号来检查现场制作的小型转储,而无需调试信息。但是,它对于跟踪内存泄漏并不是很有用。

        对于 Windows 下的内存泄漏(当然,除了像 PurifyBoundsCheckerGlowCode 这样的商业工具),您可以使用免费的 Debugging Tools for Windows 包中的 WinDbg 以及 Win32 堆标签来追踪内存泄漏的来源。

        http://www.codeproject.com/KB/cpp/MemoryLeak.aspx

        http://blogs.msdn.com/alikl/archive/2009/02/15/identifying-memory-leak-with-process-explorer-and-windbg.aspx

        【讨论】:

          【解决方案5】:

          是的,正如 J. Paulett 评论的那样,至少在 Linux 平台上,Valgrind 是一个很好的起点。

          【讨论】:

            【解决方案6】:

            在 Windows 上,我能够使用 UIforETW 获得必要的详细信息,它正在处理 xperf 的必要命令行参数。

            这篇博文非常详细地解释了一切:https://randomascii.wordpress.com/2015/04/27/etw-heap-tracingevery-allocation-recorded/


            录音

            第 1 步:创建 TracingFlags 注册表项,并在图像文件执行选项中为每个将被跟踪的进程名称设置为“1”,以告诉 Windows 堆配置自身以在启动具有该名称的进程时进行跟踪.与图像文件执行选项的情况一样,这些选项不会影响已经运行的进程——只有在设置注册表项时启动的进程才会受到影响。

            第 2 步:使用“-heap -Pids 0”咒语创建一个额外的 ETW 会话。此会话将记录启动时 TracingFlags 注册表项为“1”的进程的信息。

            细节有点乱,但既然 UIforETW 写好了,我就不用费心解释细节了,你也不必假装在听。如果您想记录堆跟踪,请使用 UIforETW,如果您想知道它是如何工作的,请查看代码,或单击“显示命令”按钮查看大部分脏衣服。

            分析

            可以使用可以从 UIforETW 方便地启动的 WPA(Windows 性能分析器)检查记录。

            推荐的列是:Process、Handle、Type、Stack。

            分配类型有:

            • AIFO - 内部分配释放外部(提示,提示)
            • AOFI – 分配外部释放内部
            • AOFO – 分配到外部释放到外部
            • AIFI - 分配在内部释放内部

            【讨论】:

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