如何创建内存转储和分析内存泄漏?
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 - 分配在内部释放内部【讨论】:
以上是关于如何创建内存转储和分析内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章