mtrace是一个有效的工具来查看有没有内存泄漏。它会将内存出现的异常记录在日志中,而日志的路径是可以指定的。
使用mtrace来调试程序有4个基本的步骤,需要用到GNUC函数库里面的一些辅助的函数功能。
1.在需要跟踪的程序中需要包含头文件<mcheck.h>,而且在main()函数的最开始包含一个函数调用:mtrace()。由于在 main函数的最开头调用了mtrace(),所以该进程后面的一切分配和释放内存的操作都可以由mtrace来跟踪和分析。
2.定义一个环境变量,用来指示一个文件。该文件用来输出log信息。如下的例子:
$export MALLOC_TRACE=mymemory.log
3.正常运行程序。此时程序中的关于内存分配和释放的操作都可以记录下来。
4.然后用mtrace使用工具来分析log文件。例如:
1. #include<stdio.h>
2. #include<stdlib.h>
3. #include<mcheck.h>
4. #include<assert.h>
5.
6. int main()
7. {
8.
9. assert(!setenv("MALLOC_TRACE","./malloc.log",1)) ;
10. mtrace();
11. int *p = malloc(100*sizeof(int));
12.
13. return 0;
14.}
mtrace会将内存情况记录下来,记录的结果存在什么地方呢?由环境变量MALLOC_TRACE决定。所以实际上有两种设置环境变量的方法,一种情况就是代码中体现的:
1、setenv函数设定环境变量 MALLOC_TRACE
setenv("MALLOC_TRACE","./malloc.log",1)
2、shell设定环境变量MALLOC_TRACE
exportMALLOC_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 2root root 4096 2012-04-03 12:17 ./
6. drwxr-xr-x 36root root 4096 2012-04-03 12:01 ../
7. -rw-r--r-- 1root root 155 2012-04-03 12:17 malloc.log
8. -rwxr-xr-x 1root root 8550 2012-04-03 12:17 test*
9. -rw-r--r-- 1root 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.
14.Memory not freed:
15.-----------------
16.Address Size Caller
17.0x09a683b0 0x190 at /home/libin/program/C/mem_bug/test.c:11
注意:由于嵌入式Linux下没有mtrace工具,故可以将生成的log文件拷贝到demo所在的共享目录下来使用mtrace工具查看。