Linux上的轻量级内存泄漏调试

gla*_*lig 17 c c++ linux valgrind

我首先查找了现有的答案,并看到Valgrind是每个人最喜欢的linux上内存泄漏调试工具.不幸的是,Valgrind似乎并不适用于我的目的.我会尽力解释原因.

约束:

  • 泄漏仅在客户的环境中重现.由于某些法律限制,我们必须使用现有的二进制文件.没有重建.
  • 在常规环境中,我们的应用程序消耗大约10%的CPU.说,我们可以容忍高达10倍的CPU使用量增加.使用默认memcheck 设置的Valgrind会使我们的应用程序长时间无响应.

我需要的是相当于Microsoft的UMDH:打开每个堆分配的堆栈跟踪,然后在某个时间点转储按堆栈分组的所有分配,并按分配计数按降序排序.我们的应用程序在Windows和Linux平台上提供,因此我知道在UMDH下的Windows上的性能仍然可以容忍.

以下是我考虑的工具/方法

  • Valgrind-memcheck-massif工具它们做的远远超过了需要(比如为每个分配指针扫描整个进程内存),它们太慢了,它们仍然没有完全按照我的
    需要执行(转储按计数排序的callstack) ,所以我将编写一些解析输出的脚本
  • dmalloc库(dmalloc.com)需要新的二进制文件
  • LeakTracer(http://www.andreasen.org/LeakTracer/)仅适用于C++ new/delete(我也需要malloc/free),没有逐个堆栈和排序功能
  • 使用LD_PRELOAD机制将自己实现为.so库(使用LD_PRELOAD机制覆盖'malloc')至少需要一周的时间,因为我的Linux编码技能,并且感觉就像发明了一辆自行车.

我错过了什么吗?是否有任何轻量级Valgrind选项或现有的LD_PRELOAD工具?

Dan*_*lKO 14

GNU libc内置了malloc调试:

http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html

使用LD_PRELOAD mtrace()从您自己的.so 调用:

#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
    mtrace();
}
Run Code Online (Sandbox Code Playgroud)

编译它:

gcc -shared -fPIC dbg.c -o dbg.so
Run Code Online (Sandbox Code Playgroud)

运行它:

export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
Run Code Online (Sandbox Code Playgroud)

稍后检查输出文件:

mtrace ./my-leaky-program out.txt
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001bda460     0x96  at /tmp/test/src/test.c:7
Run Code Online (Sandbox Code Playgroud)

当然,您可以随意编写自己的malloc挂钩来转储整个堆栈(如果您认为这会有所帮助,则调用backtrace()).

如果您在某处保留了二进制文件的调试信息,则可以获得行号和/或函数名称(例如,二进制文件内置了一些调试信息,或者您执行了调试信息objcopy --only-keep-debug my-leaky-program my-leaky-program.debug).


此外,您可以尝试Boehm的GC,它也可用作检漏仪:

http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html

  • 然后我会保持一个固定大小的哈希表; 为每个`malloc()`插入一条记录,为每个`free()`删除它,如果发生碰撞,只输出到文件.使用适当的大小,它应该足以丢弃出现在输出文件中的短期分配.在并发队列的帮助下,可以在专用线程中写入文件. (2认同)

mil*_*anw 5

我想宣传我刚刚宣布的 heaptrack 实用程序,这应该正是您当时正在寻找的。您可以在此处找到更多信息:http : //milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux

与您的 heapwatch 工具相比,性能应该要好得多,因为我使用 libunwind 和后来的 libbacktrace 来延迟带有 DWARF 调试信息的回溯注释。

我很想得到更多关于它的反馈,所以试试吧!


Bin*_* Wu 5

memleax应该适合你。

它通过附加来调试正在运行的进程的内存泄漏,而无需重新编译程序或重新启动目标进程。非常方便,适合生产环境。

它仅针对 malloc/free() 调用进行陷阱处理,因此它对性能的影响应该比 Vagrild 小。

它适用于 GNU/Linux-x86_64 和 FreeBSD-amd64。

注意:我是作者,欢迎任何建议


gla*_*lig 1

令人惊讶的是,我无法在开源域中找到类似 Microsoft UMDH 的任何内容,也无法立即下载。(我还查看了Google Heap Leak Checker,但它更像是 Valgrind,而不是 UMDH)。因此,我最终使用malloc 仪器项目作为参考点自己编写了该工具:

https://github.com/glagolig/heapwatch

该工具有很多限制,但它对于我的目的来说效果很好。