当前位置:   article > 正文

Linux编程替换库函数___wrap __real

__wrap __real

背景

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

实现

malloc,calloc,realloc实现如下:

  1. void * __wrap_malloc(size_t size) {
  2. void* result;
  3. result = (void*)__real_malloc(size);
  4. printf(" malloc: size=%d\n", size);
  5. return result;
  6. }
  7. void * __wrap_calloc(size_t nmemb, size_t size) {
  8. void* result;
  9. result = (void*)__real_calloc(nmemb, size);
  10. printf(" calloc: size=%d\n", size);
  11. return result;
  12. }
  13. void * __wrap_realloc(void *ptr, size_t size) {
  14. void* result;
  15. result = __real_realloc(ptr, size);
  16. printf("realloc: size=%d\n", size);
  17. return result;
  18. }

编译参数:

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

测试

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

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

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

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

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号