使用mtrace进行内存泄漏检测
一、使用mtrace
要加入头文件
#include <mcheck.h>
通过mtrace()
和muntrace()
放在要测试的代码的前后
mtrace();
void *p1 = malloc(10);
void *p2 = malloc(20); //calloc, realloc
free(p1);
void *p3 = malloc(20);
void *p4 = malloc(20);
free(p2);
free(p4);
muntrace();
进行编译(一定要加-g,否则最后没法看出行号)
gcc -o memleak memleak.c -g
定义一个环境变量,表示内存泄漏的日志存放的位置
export MALLOC_TRACE=./test.log
执行,输出test.log
./memleak
查看test.log
由于里面同时记录了malloc和free,因此把内存地址相同的给删除,剩下的就是内存泄漏的
可以看到 此时代码段地址为0x400a41
通过addr2line
命令,查看是242行,位于memleak.c文件main函数中
确实p3没有释放,存在内存泄漏
二、完整代码
#include<stdlib.h>
#include<mcheck.h>
int main(){
mtrace();//跟踪
void *p1 = malloc(10);
void *p2 = malloc(20);
free(p1);
void *p3 = malloc(20);//内存泄漏
void *p4 = malloc(20);
free(p2);
free(p4);
muntrace();//停止跟踪
}