如何创建内存转储和分析内存泄漏?

Posted

技术标签:

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

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

孤立块地址孤立呼叫 堆栈

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

谢谢

【问题讨论】:

Valgrind 经常被提及用于分析和捕获内存泄漏。 【参考方案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 下的内存泄漏(当然,除了像 Purify、BoundsChecker 和 GlowCode 这样的商业工具),您可以使用免费的 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 - 分配在内部释放内部

【讨论】:

以上是关于如何创建内存转储和分析内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏的java堆和线程分析

转储内存以查找 C++ 应用程序中的内存泄漏

使用UMDH检测内存泄漏

如何使用转储文件来诊断内存泄漏?

如何在eclipse中使用MAT查找内存泄漏

NodeJS 内存增长(内存泄漏)