使用memwatch跟踪linux内存泄漏

本文介绍了一种名为memwatch的内存监视工具,它可以检测程序中的内存泄漏和其他内存错误,如双重释放、错误释放等问题。文章提供了如何安装和使用memwatch的具体步骤,并通过一个示例程序展示了如何发现未释放的内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:
http://blog.youkuaiyun.com/kehyuanyu/article/details/25217907
http://blog.sina.com.cn/s/blog_590be5290102w5ve.html
根据log可以查找出申请了却没有释放内存的行号。
一、简介
memwatch可以跟踪程序中的内存泄漏和错误,能检测双重释放(double-free)、错误释放(erroneousfree)、没有释放的内存(unfreed memory)、溢出(Overflow)、下溢(Underflow)等。
下载地址:
http://www.linkdata.se/sourcecode/memwatch/
解压后,得到源码 memwatch.c 和 memwatch.h

二、安装及使用
memwatch根本是不需要安装的,因为它只是一组C程序代码。需要做的是:
1、在代码中加入 memwatch.c 和 memwatch.h,一起编译、链接
2、编译时定义宏 DMEMWATCH、DMW_STDIO,即在编译程序时加上选项-DMEMWATCH-DMW_STDIO

三、例子
int main(int argc,char **argv)
{
    int i = 0;
    char *p;

    mwInit();  //执行memwatch的初始化工作。虽然memwatch有在第一次使用时能够自动装载,但作者还是建议我们使用该函数。

    p = malloc(100);
    p = malloc(200);
    free(p);

   for(i=0;i<5;i++)
    {
       p = malloc(50);
       if(p == NULL)
       {
          printf("can't malloc memory for test,num:%d\n",i);
          continue;
       }

       if((i%2) == 0)
       {
          free(p);
           p =NULL;
       }
    }

    mwTerm();  //执行memwatch的清除工作。当我们使用了mwInit()时,就必须使用该函数来终止memwatch的工作。

    return 1;
}

运行程序,会在当前目录生产memwatch.log文件,内容如下:
============= MEMWATCH 2.71 Copyright (C) 1992-1999 JohanLindh =============

Started at Wed Mar  9 14:52:14 2016

Modes: __STDC__ 64-bit mwDWORD==(unsigned long)
mwROUNDALLOC==8 sizeof(mwData)==32 mwDataSize==32


Stopped at Wed Mar  9 14:52:14 2016

unfreed: <9> ../main.c(26), 50 bytes at 0x855c3a0  {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE................}
unfreed: <6> ../main.c(26), 50 bytes at 0x855c268  {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE................}
unfreed: <1> ../main.c(20), 100 bytes at 0x855c1d0  {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE................}

Memory usage statistics (global):
 N)umber of allocations made: 7
 L)argest memory usage     : 300
 T)otal of all alloc() calls: 550
 U)nfreed bytes totals     : 200

参考进行修改代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值