手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux C动态内存泄漏追踪方法

[日期:2016-08-04] 来源:Linux社区  作者:san-fu-su [字体: ]

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()函数来释放内存。

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-08/133927.htm

linux
相关资讯       Linux c  Linux C动态内存泄漏 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款