Linux编程替换库函数

背景

在查找用户程序内存泄漏时,怀疑是频繁malloc而没有free,由于有些malloc没有进行封装导致不能在所以调用malloc处添加size的打印,所以计划替换库中的malloc函数。

实现

malloc,calloc,realloc实现如下:

void * __wrap_malloc(size_t size) {
	void* result;
	result = (void*)__real_malloc(size);
	printf(" malloc: size=%d\n", size);
	return result;
}

void * __wrap_calloc(size_t nmemb, size_t size) {
	void* result;
	result = (void*)__real_calloc(nmemb, size);
	printf(" calloc: size=%d\n", size);
	return result;
}

void * __wrap_realloc(void *ptr, size_t size) {
	void* result;
	result = __real_realloc(ptr, size);
	printf("realloc: size=%d\n", size);
	return result;
}

编译参数:

-Wl,--wrap=malloc,--wrap=calloc,--wrap=realloc

测试

在代码中调用malloc,calloc,realloc的地方就会把size打印出来,然后看打印size的频率和大小,对比进程的VSZ大小;如果能匹配就是代码中malloc有泄漏,如果不匹配或者malloc频繁的地方有free,那么可能就不是用户程序代码问题,而是调用了其他库函数或者其他进程函数导致问题。

内存泄漏比较隐藏的地方常见于函数中malloc后返回指针,上层函数使用后没有进行释放导致内存泄漏,这类问题比较难查,且内存泄漏工具貌似检测不出此类问题,比如gcc asan。

root@www:~# ps
  PID USER       VSZ STAT COMMAND
 1121 root     33624 S    ifotond
cat /proc/1121/status | grep VmPeak -A 5
VmPeak:	   33628 kB
VmSize:	   33624 kB    虚拟内存(每隔132K的增长值)
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	    4876 kB    实际使用物理内存(4K单位增长)
VmRSS:	    4876 kB

参考文档链接:https://blog.csdn.net/force_eagle/article/details/9027789

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值