定位C/C++内存泄漏(linux)
mtrace原理
mtrace 工具的主要思路是在我们的调用内存分配和释放的函数中装载 “钩子(hook)” 函数,通过 “钩子(hook)” 函数打印的日志来帮助我们分析对内存的使用是否存在问题。对该工具的使用包括两部分内容,一个是要修改源码,装载 hook 函数,另一个是通过运行修改后的程序,生成特殊的 log 文件,然后利用 mtrace 工具分析日志,判断是否存在内存泄露以及定位可能发生内存泄露的代码位置。 我们通过mtrace来定位内存泄漏的问题。
通过 man mtrace命令可以看到:
注意图中说明:
- mtrace只对malloc、realloc、free生效,对C++的new是无效的。
- 可以使用 export MALLOC_TRACE ./test.log 指定log生成的位置。
代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mcheck.h>
int main()
{
mtrace(); //开始内存跟踪
int i = 0;
while (i++ < 1000000)
{
malloc(1024);
//new char[1024]; //不生效
usleep(1);
}
muntrace();//结束内存跟踪
return 0;
}
编译命令:
export MALLOC_TRACE ./test.log
gcc -o test test.c -g
./test
注意:编译时,添加“-g”参数
方法一:
打开另一特terminal,输入:
mtrace ./test test.log
可以看到文件和行数:
若提示’not found mtrace command’, 需要安装:
yum install glibc-utils
方法二:
打开另一特terminal,输入:
cat test.log //查看log信息,可看到内存泄漏的地址信息
根据log中的地址信息查询:
addr2line -f -e test 0x4005c4 //addr2line使用方法可以用man查看