一、使用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();//停止跟踪 }