常用内存泄露检测手段 dmalloc, mpatrol mtrace memwatch  dbgmem valgrind Electric Fence

dmalloc用法快速入门

原文链接

常用内存泄露检测手段有

dmalloc是一个简单易用的C/C++内存leak检查工具,以一个运行库的方式发布。

dmalloc能够检查出直到程序运行结束还没有释放的内存,并且能够精确指出在
哪个源文件的第几行。

dmalloc 主页: http://dmalloc.com

支持的平台:AIX, BSD/OS, DG/UX, Free/Net/OpenBSD, GNU/Hurd, HPUX, Irix, Linux, MS-DOG, NeXT, OSF, SCO, Solaris, SunOS, Ultrix, Unixware, Windoze, and even Unicos on a Cray T3E

最新版本: 5.5.2

安装:下载 http://dmalloc.com/releases/dmalloc-5.5.2.tgz

 

  1. tar zxvf dmalloc-5.5.2.tgz

  2. cd dmalloc-5.5.2

  3. ./configure

  4. make

  5. make install

 

设置环境变量:
对于 Bash, ksh, and zsh (http://www.zsh.org/), 在 `.bashrc', `.profile', or `.zshrc'
文件中加入一行 ( -b 参数表示针对Bash的输出):

function dmalloc { eval `command dmalloc -b $*`; }

然后重新登陆用户,或者执行: source ~/.bashrc 或 source ~/.profile

接下面执行:

  1. dmalloc -l logfile -i 100 low

 

在源文件中添加下面的C代码:

#ifdef DMALLOC
#include "dmalloc.h"
#endif

编译使用的CFLAGS: -DDMALLOC -DDMALLOC_FUNC_CHECK

如: gcc -DDMALLOC -DDMALLOC_FUNC_CHECK dm_test.c

执行:
./a.out

运行上面的命令会在当前目录下生成 logfile文件,查看logfile的内容如下:

cat logfile

  1. 1214894489: 2: Dmalloc version '5.5.2' from 'http://dmalloc.com/'

  2. 1214894489: 2: flags = 0x4e48503, logfile 'logfile'

  3. 1214894489: 2: interval = 100, addr = 0, seen # = 0, limit = 0

  4. 1214894489: 2: starting time = 1214894489

  5. 1214894489: 2: process pid = 9560

  6. 1214894489: 2: Dumping Chunk Statistics:

  7. 1214894489: 2: basic-block 4096 bytes, alignment 8 bytes

  8. 1214894489: 2: heap address range: 0xb8020000 to 0xb8029000, 36864 bytes

  9. 1214894489: 2:     user blocks: 1 blocks, 4043 bytes (10%)

  10. 1214894489: 2:    admin blocks: 8 blocks, 32768 bytes (89%)

  11. 1214894489: 2:    total blocks: 9 blocks, 36864 bytes

  12. 1214894489: 2: heap checked 1

  13. 1214894489: 2: alloc calls: malloc 2, calloc 0, realloc 0, free 0

  14. 1214894489: 2: alloc calls: recalloc 0, memalign 0, valloc 0

  15. 1214894489: 2: alloc calls: new 0, delete 0

  16. 1214894489: 2:   current memory in use: 11 bytes (2 pnts)

  17. 1214894489: 2:  total memory allocated: 11 bytes (2 pnts)

  18. 1214894489: 2:  max in use at one time: 11 bytes (2 pnts)

  19. 1214894489: 2: max alloced with 1 call: 6 bytes

  20. 1214894489: 2: max unused memory space: 53 bytes (82%)

  21. 1214894489: 2: top 10 allocations:

  22. 1214894489: 2:  total-size  count in-use-size  count  source

  23. 1214894489: 2:           6      1           6      1  dm_test.c:71

  24. 1214894489: 2:           5      1           5      1  dm_test.c:69

  25. 1214894489: 2:          11      2          11      2  Total of 2

  26. 1214894489: 2: Dumping Not-Freed Pointers Changed Since Start:

  27. 1214894489: 2:  not freed: '0xb8028fc8|s1' (6 bytes) from 'dm_test.c:71'

  28. 1214894489: 2:  not freed: '0xb8028fe8|s1' (5 bytes) from 'dm_test.c:69'

  29. 1214894489: 2:  total-size  count  source

  30. 1214894489: 2:           6      1  dm_test.c:71

  31. 1214894489: 2:           5      1  dm_test.c:69

  32. 1214894489: 2:          11      2  Total of 2

  33. 1214894489: 2: ending time = 1214894489, elapsed since start = 0:00:00

 

那么,哪个地方的内存leak就一目了然了。

//====== dm_test.c 源代码 =============

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4.  

  5. #ifdef DMALLOC

  6. #include <dmalloc.h>

  7. #endif

  8.  

  9. int main(int argc, char **argv)

  10. {

  11.    

  12.     char *str;

  13.  

  14.     str = malloc(5);

  15.  

  16.     str = malloc(6);

  17.    

  18.     return 0;

  19. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值