分享

内存泄漏定位工具--mtrace

 西北望msm66g9f 2020-09-13

我们前面写了一篇关于利用malloc的钩子回调定位程序内存泄漏位置的文章。实际上glibc也利用了malloc这一机制,给我们提供了现成的内存泄漏定位工具mtrace。

mtrace 用于开启内存使用记录,muntrace用于取消内存使用记录。内存使用情况会记录到一个文件,文件名由环境变量:MALLOC_TRACE指定。

  • 1. 代码中添加mtrace(), muntrace() 函数

#include <mcheck.h>
int main(int argc, char* argv[])
{
#ifdef  MEMORY_CHECK
    mtrace();
#endif 

... // other codes

#ifdef  MEMORY_CHECK
    muntrace();
#endif 
}
  • 2. 编译代码
    gcc -g  xxx.c  -o xxx
    必须使用 -g 选项,否则无法定位到泄漏的位置。

  • 3. 设置内存跟踪的保存路径,并运行代码

export MALLOC_TRACE=xxx.log
./xxx
  • 4. 分析程序运行时保留的结果

mtrace xxx  xxx.log

此处调用的mtrace是glibc提供的一个用于解析mtrace函数执行结果的perl脚本,位于/usr/bin下面,你可以用vi打开。

实例如下:
test_mcheck.c

#include <mcheck.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
    void * ptr;
    mtrace();
    ptr = malloc(100);//故意不释放
    muntrace();
    return 0;
}

运行结果:


这是编译程序不加-g选项的情况,可以看到caller一列的信息为??:?。caller这一列表示未释放的malloc位置的文件名和行号。

加了-g选项的结果:

原理很简单,mtrace函数会注册malloc和free的钩子(见前面文章),在钩子里打印信息到我们设置的文件。再利用mtrace脚本工具对统计信息进行解析,没有成对出现的malloc/free即被认为是内存泄漏,同时利用-g后a.out里的调试信息,输出泄漏的所在文件名和行号。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多