调试过程中经过会遇到各种各样的内存问题,内存泄漏、重复释放、内存溢出等,当然技术手段也有很多总,比如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