zoukankan      html  css  js  c++  java
  • linuxC动态内存泄漏追踪方法

      C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借有还才是好孩子)。当你想找出内存泄露的地方时,有的投入海量的代码中,头痛不已。还好GNU C库提供了些简单的方法。

      mtrace和muntrace两个函数可以帮助我们追踪动态内存使用情况。前提是我们设置了MALLOC_TRACE环境变量,改环境变量需要指向我们系统下的一个可写入的常规文件。做法如下:

    MALLOC_TRACE=/your/path/to/file.txt
    export MALLOC_TRACE

      mtrace会为malloc,remalloc和free安装一些特殊的handlers。这些函数的使用情况都会被记录在文件中。

      muntrace会卸载之前安装的特殊handlers。也就意味着动态内存追踪结束。

      一般情况下我们在main函数开头部分调用mtrace,return之前调用muntrace。

      这两个的函数原型在下面给出

    #include<mecheck.h>
    void mtrace(void)
    void muntrace(void)

      使用实例:

    #include<mcheck.h>
    #include<stdlib.h> int main(int argc, char *argv[]) { #ifdef DEBUG mtrace(); #endif int *a = NULL a = malloc(sizeof(int)); //在这里我们不调用free函数 return 0; }

      在上面的代码中,我们没有调用muntrace(),也不推荐使用。原因是在linux C中不仅是你的程序会追踪动态内存问题,C库也会使用。如果你调用muntrace(),那就意味着C库停止追踪动态内存。

      如果你使用宏定义DEBUG编译文件,执行编译后的可执行文件,你会发现file.txt里面有些我们看不懂的东西。这些内容是给机器看的。大多数linux发行版本都带有mtrace命令(没错,名字一样的)。使用mtrace命令将机读内容转化为人读。使用如下命令:

    mtrace a.out file.txt

    上述代码执行该命令后的结果如下

    Memory not freed:
    -----------------------
        Address        Size            Caller
    0x092a6378    0x4    at     /root/tmp.c:9

    很显然第9行的malloc函数,我们没有调用相应的free()函数来释放内存。

  • 相关阅读:
    齐文词根词缀---3.12、ced-走
    感悟总结---2104012起(文字收集)
    齐文词根词缀---3.11、log说话
    齐文词根词缀---3.10、cata-向下(和cat,cad,cid,cis是一样的)
    齐文词根词缀---3.9、carn-肉、肉欲
    齐文词根词缀---3.8、capit-头(cap帽子)
    齐文词根词缀---3.7、-tect盖子
    齐文词根词缀---3.6、cant-唱、说
    齐文词根词缀---3.5、cad- / cas- 落下(【音变t-d-s】)
    CURL 发送POST请求
  • 原文地址:https://www.cnblogs.com/san-fu-su/p/5737984.html
Copyright © 2011-2022 走看看