Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3885087
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8585
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: C/C++

2012-04-03 12:10:14

    进来事情比较多,离职,入职,搬家,然后宽带没办好。进入新公司,很多精力花费在研究公司代码上,同时,需要学习shell和数据库 PHP,精力比较分散,所以好久没有写博客了。
    近乡情更怯,先发一篇比较简单的,热热身,找找感觉。

    mtrace是一个有效的工具来查看有没有内存泄漏。它会将内存出现的异常记录在日志中,而日志的路径是可以指定的。

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<mcheck.h>
  4. #include<assert.h>

  5. int main()
  6. {

  7.         assert(!setenv("MALLOC_TRACE","./malloc.log",1)) ;
  8.         mtrace();
  9.         int *p = malloc(100*sizeof(int));

  10.         return 0;
  11. }
    我们看上面的代码,mtrace打开跟踪开关,我们malloc了400个字节的内存空间,但是我们并没有调用free将malloc出来的空间释放掉(当然函数退出也就释放了,但是这种释放不太优雅)。
    mtrace会将内存情况记录下来,记录的结果存在什么地方呢?由环境变量MALLOC_TRACE决定。所以实际上有两种设置环境变量的方法,一种情况就是代码中体现的:
    1 setenv函数设定环境变量 MALLOC_TRACE

  1. setenv("MALLOC_TRACE","./malloc.log",1)

   2 shell设定环境变量MALLOC_TRACE .
  1. export MALLOC_TRACE=~/program/C/MEM_CHECK/memcheck.log
下面看输出情况:

点击(此处)折叠或打开

  1. root@libin:~/program/C/mem_bug# gcc -o test test.c -g
  2. root@libin:~/program/C/mem_bug# ./test
  3. root@libin:~/program/C/mem_bug# ll
  4. 总用量 28
  5. drwxr-xr-x 2 root root 4096 2012-04-03 12:17 ./
  6. drwxr-xr-x 36 root root 4096 2012-04-03 12:01 ../
  7. -rw-r--r-- 1 root root 155 2012-04-03 12:17 malloc.log
  8. -rwxr-xr-x 1 root root 8550 2012-04-03 12:17 test*
  9. -rw-r--r-- 1 root root 208 2012-04-03 12:17 test.c
  10. root@libin:~/program/C/mem_bug# mtrace ./test malloc.log
  11. - 0x09a68008 Free 3 was never alloc'd 0x1da8ef
  12. - 0x09a68028 Free 4 was never alloc'd 0x1da8f7
  13. Memory not freed:
  14. -----------------
  15. Address Size Caller
  16. 0x09a683b0 0x190 at /home/libin/program/C/mem_bug/test.c:11












阅读(5335) | 评论(3) | 转发(4) |
给主人留下些什么吧!~~

Heartwork2012-04-04 22:35:41

Bean_lee: 兄弟果然是行家啊。
1 第一个问题应该是不能跟踪共享内存,GNU C的说明里面提到,它跟踪的主要  对象是malloc realloc。具体我没我没深入研究。

2 很多长期运.....
行家不敢当,久病成良医吧,呵呵:)

Bean_lee2012-04-04 22:03:45

Heartwork: 实际项目中有两种特殊情况,不知道这个工具能不能帮上忙:

1)使用了非malloc的方式分配内存,比如在多进程环境下使用mmap或者shm

2)虽然使用了malloc分配内.....
兄弟果然是行家啊。
1 第一个问题应该是不能跟踪共享内存,GNU C的说明里面提到,它跟踪的主要  对象是malloc realloc。具体我没我没深入研究。

2 很多长期运行的程序,为了防止内存碎片,喜欢初始化的时候用malloc批发一大块内存,但是内存批发下来,自己组织内存 分配 回收,但是这种情况,一般直到程序退出,都不会讲批发的内存还给系统,所以这种情况也很难检测的到。

Heartwork2012-04-04 21:53:34

实际项目中有两种特殊情况,不知道这个工具能不能帮上忙:

1)使用了非malloc的方式分配内存,比如在多进程环境下使用mmap或者shm

2)虽然使用了malloc分配内存,但是系统内部将分配出来的内存划为内存池(供其他线程)使用