mtrace是GNU扩展函数,mtrace为内存分配函数(malloc, realloc, memalign, free)安装hook函数。这些hook函数记录内存的申请和释放的trace信息。
这些trace信息可以用来发现内存泄漏和释放不是申请的内存。
当调用mtrace,mtrace会检查环境变量MALLOC_TRACE。该环境变量应该包含记录trace信息的文件路径。如果文件可以被成功打开,它的大小被截断为0。
// memoryLeakageTest.c
#include <mcheck.h> // 在程序起始处增加头文件
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
setenv("MALLOC_TRACE", "mtrace.out", 1); // 设置环境变量,让trace信息保存在mtrace.out中
mtrace(); // 调用函数mtrace()开始监控
char *p = (char *)malloc(10);
if (p)
printf("Memory Allocated successful\n");
else
printf("Not Enough Memory\n");
muntrace(); // 调用函数muntrace()停止监控
return 0;
}
root@ubuntu:/home/xl# g++ -Wall -g memoryLeakageTest.c -o memoryLeakageTest // 编译的时候需要加上 -g
root@ubuntu:/home/xl# ./memoryLeakageTest
Memory Allocated successful
root@ubuntu:/home/xl# mtrace memoryLeakageTest mtrace.out // 分析trace信息
- 0x0000000001021010 Free 4 was never alloc'd 0x7efdc1e7ce9d
- 0x00000000010210e0 Free 5 was never alloc'd 0x7efdc1f46d2f
- 0x0000000001021100 Free 6 was never alloc'd 0x7efdc1fb664c
Memory not freed:
-----------------
Address Size Caller
0x0000000001021570 0xa at /home/xl/studyDir/memoryCheckTool/memoryLeakageTest.c:9
参考文档:
https://en.wikipedia.org/wiki/Mtrace
http://blog.csdn.net/gatieme/article/details/51959654
http://elinux.org/Memory_Debuggers