快速追踪内存使用情况的方法

函数mtrace是linux中用于开启内存使用记录的函数接口,而函数muntrace是关闭内存使用记录的函数接口,另外环境变量MALLOC_TRACE则是决定内存使用记录是否记录到文件中。

#include <mcheck.h>
void mtrace(void);
void muntrace(void);

一、入门例子

1、首先给出简单的例子,初步了解函数的使用方法。

#include <mcheck.h>
#include <stdlib.h>

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 <mcheck.h>
#include <stdlib.h>

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 <mcheck.h>
#include <stdlib.h>

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,然后按下回车键。

如果安装成功的话,那么最后会出现“Complete!”的提示信息

2、将trace.log转换为可读性的信息,其格式为:mtrace 可执行文件  生成的记录内存文件, 如下图所示,终端执行mtrace  a.out trace.log之后,界面直接显示“Memory not freed:”表示内存没有释放,并且还指出文件的具体位置。

五、总结

mtrace()是linux上开启记录内存的函数接口,muntrace()是关闭记录内存的函数接口,MALLOC_TRACE是决定是否将记录内存情况写入文件的环境变量,mtrace命令是glibc-utils的工具,可以将记录内存情况的文件转换为可理解的信息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注