微信公众号:二进制人生
专注于嵌入式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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





