内存检查工具

2019-02-25 language linux c/cpp

mtrace

mtrace 是 GNU 的扩展函数,用来跟踪各种的内存分配,实际上就是对内存分配函数添加 hook ,在这些 hook 函数中记录内存的申请和释放信息。

需要在程序中调用函数,然后在执行代码前添加 MALLOC_TRACE 环境变量,该环境变量指定了 trace 信息的保存路径。

#include <mcheck.h>

void mtrace(void);
void muntrace(void);

一般可以在可能出现内存泄漏的位置添加检查,然后在运行前添加环境变量。

export MALLOC_TRACE="mtrace.out"; ./your-execuate-file

mtrace.out 文件中,会记录内存的申请释放信息,格式如下。

@ 程序名称:[内存分配调用的地址] +/- 操作的内存地址 部分参数

其中 + 表示分配;- 表示释放。

接着可以通过 mtrace 命令进行分析,该命令在 glibc-utils 包中,是一个 perl 脚本,然后通过 mtrace your-execuate-file mtrace.out 进行分析。

其它

当应用层通过类似 malloc() calloc() 之类的接口申请了一部分内存之后,会自己维护相关的数据结构,常见的有 ptmalloc2(glibc) dlmalloc tcmalloc(google) 等,其对应的策略也略有不同。

这里仅介绍下 glibc 也就是 ptmalloc2 的策略。

对于小的内存一般是通过 sbrk() 申请的,这一类的内存一般不会释放掉,只有通过 mmap() 申请的内存会通过 unmmap() 释放掉,返回给操作系统。