【发布时间】:2009-11-11 00:39:12
【问题描述】:
我需要获取以下信息来分析内存泄漏问题。该怎么做?
- 孤立块地址孤立呼叫
- 堆栈
是否有任何好的资源/工具可以了解/修复内存泄漏。
谢谢
【问题讨论】:
-
Valgrind 经常被提及用于分析和捕获内存泄漏。
标签: c++ memory-leaks
我需要获取以下信息来分析内存泄漏问题。该怎么做?
是否有任何好的资源/工具可以了解/修复内存泄漏。
谢谢
【问题讨论】:
标签: c++ memory-leaks
如果您使用的是 linux,请使用 valgrind。这是你最好的新朋友。我不确定哪些工具适用于 Windows。
【讨论】:
valgrind --leak-check=full
【讨论】:
如果您在 Windows 平台上,Microsoft Application Verifier 会执行类似于 valgrind 的内存分析。
【讨论】:
在 Windows 中,您可以使用 dbghelp.dll 中的 MiniDumpWriteDump 函数。
How to create minidump for my process when it crashes?
这对于跟踪已部署应用程序中的错误非常有帮助,因为您可以使用调试符号来检查现场制作的小型转储,而无需调试信息。但是,它对于跟踪内存泄漏并不是很有用。
对于 Windows 下的内存泄漏(当然,除了像 Purify、BoundsChecker 和 GlowCode 这样的商业工具),您可以使用免费的 Debugging Tools for Windows 包中的 WinDbg 以及 Win32 堆标签来追踪内存泄漏的来源。
【讨论】:
是的,正如 J. Paulett 评论的那样,至少在 Linux 平台上,Valgrind 是一个很好的起点。
【讨论】:
在 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。
分配类型有:
【讨论】: