背景
在查找用户程序内存泄漏时,怀疑是频繁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