赞
踩
在查找用户程序内存泄漏时,怀疑是频繁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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。