内存检测的几种方式
1、valgrind
2、mtrace
#include <mcheck.h>
void mtrace(void);
void muntrace(void);
export MALLOC_TRACE=/home/用户名/share/01code/test.log
测试代码
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
#include <mcheck.h>
int main(int argc, char **argv)
{
mtrace(); //开启内存使用记录
void *p1 = malloc(10);
void *p2 = malloc(20);
free(p1);
muntrace(); //取消内存使用记录
return 0;
}
编译执行—加-g参数
1、查看输出的文件结果
cat test.log
= Start
@ ./a.out:[0x400624] + 0x11aa450 0xa
@ ./a.out:[0x400632] + 0x11aa470 0x14
@ ./a.out:[0x400642] - 0x11aa450
= End
+号代表申请内存 -号表示释放
可以用addr2line解栈信息
2、此处用mtrace工具解析
@ubuntu:~/share/01code$ mtrace a.out test.log #mtrace 可执行文件 输出文件
Memory not freed:
-----------------
3、自定义malloc和free
方案1:自定义malloc,调用__libc_malloc和__libc_free,每次申请内存都以申请者和内存地址命名文件夹,free的时候删除对应的文件,程序结束后剩下的文件就是未释放的
代码:
https://github.com/sxt1939/code/blob/main/002testmemcheck02.c
执行结果
@ubuntu:~/share/01code$ gcc 002testmemcheck02.c -g
@ubuntu:~/share/01code$ ./a.out
malloc addr: 0x1fcc010,size:10
malloc addr: 0x1fcd680,size:10
if free :0x1fcc010
@ubuntu:~/share/01code$ ls ./mem/
0x1fcd680.mem
从结果可以看出mem文件夹下边有一个文件没有删除,这个就是未释放的内存
方案2:
用宏定义替换掉系统的malloc为自己的
https://github.com/sxt1939/code/blob/main/002testmemcheck03.c
方案3:
临时修改系统的__malloc_hook指向自己的malloc
https://github.com/sxt1939/code/blob/main/002testmemcheck04.c