【转载】__wrap_malloc动态替换malloc函数
调试过程中经过会遇到各种各样的内存问题,内存泄漏、重复释放、内存溢出等,当然技术手段也有很多总,比如mtrace、Valgrind等,但是GUN链接器实际提供了一个好用的方法
--wrap=symbol
函数名定义为__wrap_symbol ,symbol也是一个函数,那么编译的时候如果添加了链接参数,函数调用symbol时,会调用到__wrap_symbol函数,另外还有一个相关函数__real_symbol,只声明不定义的时候,会对其调用到真正的symbol函数。
举一个简单的例子:
- //test.c
-
- #include <stdio.h>
- #include <stdlib.h>
-
- void* __real_malloc(size_t size); // 只声明不定义
-
- void* __wrap_malloc(size_t size)
- {
- printf("__wrap_malloc called\n");
-
- return __real_malloc(size); //调用真正的malloc
- }
-
- int void(void)
- {
- void *mem=malloc(16);
- memset(mem, 0, 16);
- free(mem);
-
- return 0;
- }
编译命令
gcc -Wl,--wrap,malloc -o malloc_test tect.c
#:./test malloc_test
__wrap_malloc called
浙公网安备 33010602011771号