zoukankan      html  css  js  c++  java
  • 内存泄露检测之mtrace

    ————————————————
    版权声明:本文为CSDN博主「知耻而后勇的蜗牛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yf210yf/article/details/8022192

    mtrace是一个C函數,在<mcheck.h>里声明及定义,函数原型为:

     void mtrace(void);

    其实mtrace是类似malloc_hook的 malloc handler,只不过mtrace的handler function已由系统为你写好,但既然如此,系统又怎么知道你想将malloc/free的记录写在哪里呢?为此,调用mtrace()前要先设置 MALLOC_TRACE环境变量:

    #include <stdlib.h>
    setenv("MALLOC_TRACE", "output_file_name", 1);  

    【output_file_name】就是储存检测结果的文件的名称。
    但是检测结果的格式是一般人无法理解的,而只要有安装mtrace的话,就会有一名为mtrace的Perl script,在shell输入以下指令:
    mtrace [binary] output_file_name
    就会将output_file_name的內容转化成能被理解的语句。
    例如:测试程序

    #include <iostream>
    #include <mcheck.h>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
    setenv("MALLOC_TRACE","output",1);
    mtrace();
    int *p1=new int;
    int *p2=new int;
    int *p3=(int*)malloc(sizeof(int));
    int *p4=(int*)malloc(sizeof(int));

    delete p1;
    free(p3);
    return 0;
    }


    执行:
    $ g++ -Wall -g main.cpp -o main

    生成

    main

    运行

    ./main

    生成

    output文件

    查看output文件

    $mtrace main output

    可以得到内存泄露信息
    完整的运行信息如下:

    snail@ubuntu:~/Java_workspace/3_内存泄露_mtrace$ g++ -Wall -g main.cpp -o main
    main.cpp: In function ‘int main()’:
    main.cpp:10:7: warning: unused variable ‘p2’
    main.cpp:12:7: warning: unused variable ‘p4’
    snail@ubuntu:~/Java_workspace/3_内存泄露_mtrace$ ./main
    snail@ubuntu:~/Java_workspace/3_内存泄露_mtrace$ ls
    main main.cpp output
    snail@ubuntu:~/Java_workspace/3_内存泄露_mtrace$ mtrace main output
    - 0x09aa1008 Free 8 was never alloc'd 0x8778cc
    - 0x09aa10c8 Free 9 was never alloc'd 0x91556f
    - 0x09aa10e0 Free 10 was never alloc'd 0x915577

    Memory not freed:
    -----------------
    Address Size Caller
    0x09aa1478 0x4 at 0xe7c679
    0x09aa1498 0x4 at /home/snail/Java_workspace/3_内存泄露_mtrace/main.cpp:12
    snail@ubuntu:~/Java_workspace/3_内存泄露_mtrace$

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

    程序编成arm版本,在arm下运行也会生成output文件,把output文件拷贝到linux下,使用mtrace main output,同样可以查看内存问题

  • 相关阅读:
    Linux初级知识_04 -- 目录结构与目录管理
    查找无限整数序列的第n位1,2,3,4,5,6,7,8,9,10,11,...
    谷歌面试题:在半径为1的圆中随机选取一点
    FtpClient 调用storeFile 抛出 java.net.SocketException异常
    CountDownLatch 使用
    软件版本号比较 java工具类
    pcm文件转wav C语言
    unimrcp更改安装目录
    xpath学习记录
    jackson 实体转json 为NULL或者为空不参加序列化
  • 原文地址:https://www.cnblogs.com/nanqiang/p/11590083.html
Copyright © 2011-2022 走看看