我想了解内存跟踪器和检漏仪是如何工作的,所以我想到了这个想法,我有一个可执行文件,我想在执行时强制它使用我自己的内存分配函数而不是通常的系统函数(“ malloc“,”realloc“......)。
我自己的函数存储在一个库(静态或共享)或只是一个目标文件(“.o”)中,大概是这样的:
void *my_own_malloc(unsigned long size) {
printf("allocate: %lu\n", size);
return malloc(size);
}
PS:我不必更改可执行源代码(我没有源代码)
PS2:我希望在所有不同平台(Windows,OS X和Linux ......)中实现这一目标。答案 0 :(得分:3)
我不了解其他平台,但在GNU / Linux上,您可以使用LD_PRELOAD
环境变量预加载一个小型内存跟踪库,其中包含您自己的malloc
和{ {1}}已定义。
您自己的free
可能希望使用真实malloc
函数分配内存,因此这里可能存在递归问题。要解决此问题,dlsym函数可以使用malloc
参数来获取指向下一个(即真正的')RTLD_NEXT
函数的指针。
对此的一个非常小的测试可能如下所示:
malloc
如果我们调用此文件#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
void *malloc(size_t size)
{
static void *(*real_malloc)(size_t size) = 0;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void *result = real_malloc(size);
fprintf(stderr, "malloc(%d) = %p\n", (int)size, result);
return result;
}
void free(void *ptr)
{
static void (*real_free)(void *ptr) = 0;
if (!real_free)
real_free = dlsym(RTLD_NEXT, "free");
real_free(ptr);
fprintf(stderr, "free(%p)\n", ptr);
}
,可以使用命令将其编译为fakemalloc.c
共享对象
fakemalloc.so
作为测试,要查看调用gcc -fPIC -shared -Wl,-soname,fakemalloc.so -o fakemalloc.so fakemalloc.c -ldl
命令时发生的malloc
和free
次调用,您需要执行
ls
编辑如评论中所述,在glibc系统上,您可以使用LD_PRELOAD=/path/to/fakemalloc.so ls
和RTLD_NEXT
函数来避免__libc_malloc
方法。这将产生以下代码:
__libc_free