内存泄漏检测

1、valgrind

  Valgrind_Memcheck

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值