Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20354
  • 博文数量: 8
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-23 14:34
文章分类
文章存档

2012年(8)

我的朋友
最近访客

分类:

2012-12-01 22:05:54

原文地址:memwatch学习笔记(一) 作者:txgc_wm

       在最近的工作中,遇到了一个内存泄漏的问题,查了很多遍代码,都没发现出错点。所以,想借助一些工具来查出错误所在。由于嵌入式系统不像PC那样便利,所以选择了memwatch这个工具来调试,一方面它简单易用,另一方面它恰恰又是内存泄漏检测的好工具。
       我遇到的问题如下:内存会按照固定的数值泄漏(比如说是4k,那么系统运行的时候,内存就会按照这个数字递减),但并不是每次使用了的内存都不会释放,怀疑是在某些特殊的条件下没有释放掉内存。所以,写下以下代码来了解学习memwatch这个工具,希望能够帮我查出问题的所在。

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include "memwatch.h"

  4. int main(int argc,char **argv)
  5. {
  6.     int i = 0;
  7.     char *p;
  8.     
  9.     mwInit();    //执行memwatch的初始化工作。虽然memwatch有在第一次使用时能够自动装载,但作者还是建议我们使用该函数。

  10.     p = malloc(100);
  11.     p = malloc(200);
  12.     free(p);

  13.     for(i=0;i<5;i++)
  14.     {
  15.         p = malloc(50);
  16.         if(p == NULL)
  17.         {
  18.             printf("can't malloc memory for test,num:%d\n",i);
  19.             continue;
  20.         }

  21.         if((i%2) == 0)
  22.         {
  23.             free(p);
  24.             p = NULL;    
  25.         }
  26.     }

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

  28.     return;
  29. }


  30. ============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============

  31. Started at Sun Feb 26 00:50:08 2012

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


  34. Stopped at Sun Feb 26 00:50:08 2012

  35. unfreed: <9> main.c(18), 50 bytes at 0x96653b0     {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ................}
  36. unfreed: <6> main.c(18), 50 bytes at 0x9665278     {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ................}
  37. unfreed: <1> main.c(12), 100 bytes at 0x96651e0     {FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE FE ................}

  38. Memory usage statistics (global):
  39.  N)umber of allocations made: 7
  40.  L)argest memory usage : 300
  41.  T)otal of all alloc() calls: 550
  42.  U)nfreed bytes totals : 200
          在memwatch的日志文件中,准确的提出了哪些内存分配没有被释放掉。


备注:在编译源码的时候一定要加上选项-DMEMWATCH及-DMW_STDIO。
阅读(714) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~