暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

内存泄漏定位工具--mtrace

二进制人生 2020-04-19
1232

微信公众号:二进制人生
专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。
更新:2020/4/19,转载请注明出处。

我们前面写了一篇关于利用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里的调试信息,输出泄漏的所在文件名和行号。

每天进步一点点……

图 二进制人生公众号



文章转载自二进制人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论