我首先寻找现有的答案,发现Valgrind是大家最喜欢的 linux 上内存泄漏调试工具。不幸的是, Valgrind似乎不适用于我的目的。我将尝试解释原因。
约束:
- 泄漏仅在客户的环境中重现。由于某些法律限制,我们必须使用现有的二进制文件。没有重建。
- 在常规环境中,我们的应用程序消耗约 10% 的 CPU。比如说,我们可以容忍高达 10 倍的 CPU 使用率增加。使用默认memcheck设置的Valgrind 会更糟糕地使我们的应用程序长时间无响应。
我需要的是相当于 Microsoft 的UMDH:为每个堆分配打开堆栈跟踪,然后在某个时间点转储所有按堆栈分组并按分配计数降序排列的分配。我们的应用程序同时在 Windows 和 Linux 平台上发布,所以我知道在UMDH下的 Windows 上的性能仍然可以忍受。
这是我考虑过的工具/方法
- Valgrind的-memcheck和–massif工具它们做的比需要的多得多(比如扫描整个进程内存以查找每个分配指针),它们太慢了,而且它们仍然不能完全满足我
的需要(转储按计数排序的调用堆栈) ,所以我将不得不编写一些脚本来解析输出 - dmalloc库 (dmalloc.com) 需要新的二进制文件
- LeakTracer ( http://www.andreasen.org/LeakTracer/ ) 仅适用于 C++ new/delete (我也需要malloc/free ),没有按堆栈分组和排序功能
- 使用 LD_PRELOAD 机制将工具自己实现为 .so 库(使用 LD_PRELOAD 机制覆盖“malloc”)考虑到我的 Linux 编码技能,这至少需要一周时间,感觉就像发明了一辆自行车。
我错过了什么吗?是否有任何轻量级的Valgrind选项或现有的 LD_PRELOAD 工具?