linux环境下的内存泄漏检查

来源:互联网 发布:c语言打爱心 编辑:程序博客网 时间:2024/05/23 09:46

        Linux下的mtrace工具可以帮助我们检查程序中是否有内存泄漏。GNU扩展函数mtrace会为内存分配函数(malloc, realloc, memalign, free等)注册hook,记录malloc/free信息。

        使用时也非常简单,只需在代码中调用mtrace函数即可。这需要包含头文件mcheck.h。同时需要设置环境变量MALLOC_TRACE,指定信息输出到哪个文件。如果MALLOC_TRACE没有设置,或者设置的文件不可用或者不可写,那么将不会安装hook函数,mtrace不生效。

        之后编译执行,会生成内存信息文件,利用mtrace工具即可查看,格式为mtrace ./bin out_file。如果有内存泄漏,会出现Memory not freed部分。编译时如果有-g选项则会在caller处显示代码信息,说明该处的malloc没有对应的free

        mtrace的原理是记录每一对malloc-free的执行,若每一个malloc都有相应的free,则代表没有内存泄露,对于任何非malloc/free情況下所发生的内存泄露问题,mtrace并不能找出来。也就是对于new的内存,只能检测出有泄露,但不能定位。

        代码示例如下:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <mcheck.h>int main(){    setenv("MALLOC_TRACE", "output", 1);    mtrace();    char *text = (char *)malloc(sizeof(char) * 100);    // free(text);    return 0;}


        valgrind中 memcheck工具可以探测程序中内存的使用情况,它检查所有对内存的读写,并截取所有malloc/free 、new/delete调用。因此memcheck可以检查如下问题:

        1.使用未初始化的内存;

        2.读写已经被释放的内存;

        3.读写内存越界;

        4.读写不恰当的内存栈空间;

        5.内存泄漏;

        6.malloc/new/new[]与free/delete/delete[]不匹配。

检查内存泄漏,执行valgrind --tool=memcheck --leak-check=full ./bin

0 0
原创粉丝点击