函数mtrace是linux中用于开启内存使用记录的函数接口,而函数muntrace是关闭内存使用记录的函数接口,另外环境变量MALLOC_TRACE则是决定内存使用记录是否记录到文件中。
#include
void mtrace(void);
void muntrace(void);
一、入门例子
1、首先给出简单的例子,初步了解函数的使用方法
#include
#include
int main(int argc, char** argv)
{
// 设置MALLOC_TRACE环境变量
setenv("MALLOC_TRACE", "trace.log", 1);
// 开启内存使用情况记录
mtrace();
return 0;
}
2、编译运行上面创建的cpp文件
3、运行成功之后,执行ls -l查看当前目录情况,可以看到生成了trace.log文件,其内容如下图所示, 文件以“= Start”开始。
二、没有内存泄露的情况
1、原来的例子中增加调用malloc申请内存,再调用free释放内存,最后再调用muntrace关闭内存使用情况记录
#include
#include
int main(int argc, char** argv)
{
// 设置MALLOC_TRACE环境变量
setenv("MALLOC_TRACE", "trace.log", 1);
// 开启内存使用情况记录
mtrace();
char *p = (char *)malloc(10000);
free(p);
// 关闭内存使用情况记录
muntrace();
return 0;
}
2、编译上面的cpp文件,然后运行生成的可执行文件,再查看生成的trace.log文件,其内容如下所示,以“= Start”开始, 以“= End”结束, 其中+号代表申请内存,-号代表释放内存。从这个文件,我们可以发现,cpp文件最后调用muntrace函数之后,生成的tracel.log文件中的最后会以“= End”结束。
三、内存泄露的情况
1、这次在上面cpp文件的基础上,再次调用malloc申请内存,但是不释放内存
#include
#include
int main(int argc, char** argv)
{
// 设置MALLOC_TRACE环境变量
setenv("MALLOC_TRACE", "trace.log", 1);
// 开启内存使用情况记录
mtrace();
char *p = (char *)malloc(10000);
free(p);
char *p2 = (char *)malloc(20000);
// 关闭内存使用情况记录
muntrace();
return 0;
}
2、同样的编译cpp文件,然后运行可执行文件,查看生成的trace.log文件,从内容看,文件倒数第二行中申请了内存,但是没有释放内存。
四、转换为可理解的信息
从上面三个例子看,生成的trace.log的内容的可读性比较差,为了提高可读性,我们可以使用mtrace命令工具来解析trace.log文件,mtrace命令是glibc-utils的工具, 如果linux上没有mtrace命令,那么需要先下载安装glibc-utils。下面首先介绍基于fedora系统下下载安装glibc-utils的方法,最后再来介绍将trace.log转换为可读性的信息命令。
1、下载安装glibc-utils
首先终端执行命令yum install glib-utils, 然后会提示“Is this ok [y/N]:”,直接输入y,然后按下回车键。
2、将trace.log转换为可读性的信息,其格式为:mtrace 可执行文件 生成的记录内存文件, 如下图所示,终端执行mtrace a.out trace.log命令之后,界面直接显示“Memory not freed:”表示内存没有释放,并且还指出文件的具体位置。
五、总结
mtrace()是linux上开启记录内存的函数接口,muntrace()是关闭记录内存的函数接口,MALLOC_TRACE是决定是否将记录内存情况写入文件的环境变量,mtrace命令是glibc-utils的工具,可以将记录内存情况的文件转换为可理解的信息。