(本文只包含用法,没有原理分析)
老早就知道 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
关键的一步,设置环境变量 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) |