zoukankan      html  css  js  c++  java
  • mtrace检查内存泄漏

    内存泄漏检查方法(for Linux) 
    如果你更想读原始文档, 请参考glibc info的"Allocation Debugging" 
    一章 (执行info libc);
    glibc提供了一个检查内存泄漏的方法, 前提是你的程序使用glibc的标准函数分配内存(如malloc, alloc...):
    1.在需要内存泄漏检查的代码的开始调用void mtrace(void) (在mcheck.h中有声明)。mtrace为malloc等函数安装hook, 用于记录内存分配信息。
    在需要内存泄漏检查的代码的结束调用void muntrace(void)。注意: 一般情况下不要调用muntrace, 而让程序自然结束. 因为可能有些释放内存代码要到muntrace之后才运行。
    2. 用debug模式编译被检查代码(-g或-ggdb) 
    3. 设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信息. 
    4. 运行被检查程序, 直至结束或muntrace被调用. 
    5. 用mtrace命令解析内存分配Log文件($MALLOC_TRACE) 
    (mtrace foo $MALLOC_TRACE, where foo is the executible name) 
    如果有内存泄漏,mtrace会输出分配泄漏 
    内存的代码位置,以及分配数。

    For C++ Leak: 
    检查内存泄漏的方法除glibc提供外; 
    还可以试试一些专用的程序;如: 
    ccmalloc
    mpatrol
    这俩个工具的功能相当不错,能对程序进行相当全面的检查 
    很奇怪,redhat 9 居然不带mtrace perl脚本,只好下载gcc源码编译了
    wget --passive-ftp ftp://rpmfind.net/linux/redhat/9/en/os/i386/SRPMS/glibc-2.3.2-11.9.src.rpm
    rpm -ivh glibc*.src.rpm
    cd /usr/src/redhat/SPECS/
    rpmbuild -ba glibc-9.spec 
    cd /var/tmp/glibc-2.3.2-root/usr/bin/
    cp mtrace /usr/bin/
     
    调试方法如下:
    vi a.c
     


    1 #include <mcheck.h>
          2 
          3 int main()
          4 {
          5 mtrace();
          6 malloc(10);
          7 malloc(16);
          8 return 0;
          9 }


    $gcc -g a.c #记得编译带-g调试选项 
    $export MALLOC_TRACE=a.log 
    $./a.out 
    $unset MALLOC_TRACE #记得执行完后unset变量,否则可能运行其他命令可能覆盖log 
    $mtrace a.out a.log 
    Memory not freed:
    -----------------
       Address     Size     Caller
    0x09b08378      0xa  at /XXX/a.c:6
    0x09b08388     0x10  at /XXX/a.c:7

    可以看到,会显示未释放动态空间的代码具体位置.

    转自:http://lagignition.blog.163.com/blog/static/128730023201072421016361/

  • 相关阅读:
    MySQL 复制
    MySQL 复制
    MySQL 复制
    MySQL 复制
    Setup Factory 读取安装包的配置文件
    [转]VC传递消息sendmessage
    JQuery.getJSON 没反应
    C#使用SendMessage传递字符串
    C# 注册表修改 立即生效 [转]
    c#开源项目[转]
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/8042576.html
Copyright © 2011-2022 走看看