我需要了解以下内容以分析内存泄漏问题。怎么做?
是否有任何好的资源/工具可以了解/修复内存泄漏。
由于
答案 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下的内存泄漏(当然除了Purify,BoundsChecker和GlowCode之类的商业工具),您可以使用免费Debugging Tools for Windows包中的WinDbg使用Win32堆标记来追踪内存泄漏的来源。
答案 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方便地启动。
推荐的列为:“处理”,“句柄”,“类型”,“堆栈”。
分配类型为: