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

时间:2009-11-11 00:39:12

标签: c++ memory-leaks

我需要了解以下内容以分析内存泄漏问题。怎么做?

  • Orphan Block地址孤儿呼叫
  • 堆栈

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

由于

6 个答案:

答案 0 :(得分:6)

如果您使用的是Linux,请使用valgrind。这是你最好的朋友。我不确定Windows可以使用哪些工具。

答案 1 :(得分:2)

valgrind --leak-check = full

答案 2 :(得分:2)

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

答案 3 :(得分:1)

在Windows中,您可以使用MiniDumpWriteDump中的dbghelp.dll功能。

How to create minidump for my process when it crashes?

这对于跟踪已部署应用程序中的错误非常有用,因为您可以使用调试符号检查字段中生成的minidump,而无需调试信息。但是,它对于跟踪内存泄漏并不是很有用。

对于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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在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,如果要了解其工作原理,请查看代码,或单击“显示命令”按钮查看大部分脏衣服。

分析

可以使用WPA(Windows Performance Analyzer)检查记录,该记录可以从UIforETW方便地启动。

推荐的列为:“处理”,“句柄”,“类型”,“堆栈”。

分配类型为:

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