Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66473
  • 博文数量: 4
  • 博客积分: 1421
  • 博客等级: 上尉
  • 技术积分: 116
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-03 11:28
文章分类
文章存档

2010年(3)

2009年(1)

我的朋友

分类: C/C++

2010-01-19 17:03:54

(本文只包含用法,没有原理分析)
老早就知道 mtrace ,不过因为之前用自己写的内存分配调试函数所以没试验。今天一看,还是不错的:

到 /tmp 下,创建一个 test.c


$ cd /tmp
$ cat > test.c << EOF

#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>

int main(int argc, char *argv[])
{
    int *p, *q;

    mtrace();

    p = malloc(sizeof(int));
    q = malloc(sizeof(int));
    printf("p = %p\nq = %p\n", p, q);

    *p = 1;
    *q = 2;

    free(p);

    return 0;
}
EOF


 编译生成可执行文件 test,注意需要加上 -g

$ gcc -g test.c -o test


关键的一步,设置环境变量 MALLOC_TRACE 为一个文件路径,此文件用来存储 test 程序运行时生成的 mtrace 信息:

$ MALLOC_TRACE=/tmp/test_malloc_trace.output; ./test
p = 0x82a8378
q = 0x82a8388


运行后,test_malloc_trace.output 的内容为:


$ cat test_malloc_trace.output
= Start
@ ./test:[0x804849e] + 0x82a8378 0x4
@ ./test:[0x80484ae] + 0x82a8388 0x4
@ ./test:[0x80484ef] - 0x82a8378


最后,利用 mtrace perl 程序,解析这个 output 程序得到最终的结果:

$ mtrace ./test test_malloc_trace.output

Memory not freed:
-----------------
   Address Size Caller
0x082a8388 0x4 at /tmp/test.c:12


结果报告说 test.c 的第 12 行有一个 4 字节的内存泄漏。 验证一下:

$ $ cat -n test.c
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <mcheck.h>
     4
     5 int main(int argc, char *argv[])
     6 {
     7 int *p, *q;
     8
     9 mtrace();
    10
    11 p = malloc(sizeof(int));
    12 q = malloc(sizeof(int));
    13 printf("p = %p\nq = %p\n", p, q);
    14
    15 *p = 1;
    16 *q = 2;
    17
    18 free(p);
    19
    20 return 0;
    21 }


可以看到,第12行分配的内存的确没有释放
阅读(1172) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~