我们前面写了一篇关于利用malloc的钩子回调定位程序内存泄漏位置的文章。实际上glibc也利用了malloc这一机制,给我们提供了现成的内存泄漏定位工具mtrace。 mtrace 用于开启内存使用记录,muntrace用于取消内存使用记录。内存使用情况会记录到一个文件,文件名由环境变量:MALLOC_TRACE指定。
#include <mcheck.h>
mtrace xxx xxx.log 此处调用的mtrace是glibc提供的一个用于解析mtrace函数执行结果的perl脚本,位于/usr/bin下面,你可以用vi打开。 实例如下:
运行结果: 这是编译程序不加-g选项的情况,可以看到caller一列的信息为??:?。caller这一列表示未释放的malloc位置的文件名和行号。 加了-g选项的结果: 原理很简单,mtrace函数会注册malloc和free的钩子(见前面文章),在钩子里打印信息到我们设置的文件。再利用mtrace脚本工具对统计信息进行解析,没有成对出现的malloc/free即被认为是内存泄漏,同时利用-g后a.out里的调试信息,输出泄漏的所在文件名和行号。 |
|
来自: 西北望msm66g9f > 《编程》