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

2024-04-25

我首先寻找现有的答案并看到Valgrind是大家最喜欢的 Linux 内存泄漏调试工具。很遗憾Valgrind似乎不适合我的目的。我将尝试解释原因。

限制条件:

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

我需要的是微软的同等产品UMDH:为每个堆分配打开堆栈跟踪,然后在某个时间点转储按堆栈分组并按分配计数降序排列的所有分配。我们的应用程序同时支持 Windows 和 Linux 平台,因此我知道 Windows 上的性能UMDH还是可以忍受的。

这是我考虑的工具/方法

  • Valgrind's -内存检查 and –massif它们做的事情比需要的要多得多(例如扫描整个进程内存以查找每个分配) 指针),它们太慢了,而且它们仍然没有完全按照我的方式做
    需要(转储按计数排序的调用堆栈),所以我必须写一些 解析输出的脚本
  • dmalloc库 (dmalloc.com) 需要新的二进制文件
  • 泄漏追踪器(http://www.andreasen.org/LeakTracer/ http://www.andreasen.org/LeakTracer/) 仅适用于 C++新建/删除(我需要分配/释放也),没有按堆栈分组 和排序功能
  • 使用 LD_PRELOAD 自己将工具实现为 .so 库 机制 (使用 LD_PRELOAD 机制覆盖“malloc” https://stackoverflow.com/questions/6083337/overriding-malloc-using-the-ld-preload-mechanism) 考虑到我的 Linux 编码技能,这至少需要一周的时间,而且感觉 就像发明自行车一样。

我错过了什么吗?有没有轻量的Valgrind选项或现有的 LD_PRELOAD 工具?


GNU libc 有内置的 malloc 调试:

http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html 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();
}

编译它:

gcc -shared -fPIC dbg.c -o dbg.so

运行它:

export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program

稍后检查输出文件:

mtrace ./my-leaky-program out.txt

你会得到类似的东西:

Memory not freed:
-----------------
           Address     Size     Caller
0x0000000001bda460     0x96  at /tmp/test/src/test.c:7

当然,您可以随意编写自己的 malloc 钩子来转储整个堆栈(调用回溯() http://www.gnu.org/software/libc/manual/html_node/Backtraces.html如果您认为这会有所帮助)。

如果您将二进制文件的调试信息保存在某处(例如,二进制文件内置了一些调试信息,或者您做了objcopy --only-keep-debug my-leaky-program my-leaky-program.debug).


另外,您可以尝试 Boehm 的 GC,它也可以用作泄漏检测器:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux上的轻量级内存泄漏调试 的相关文章

随机推荐