C++ 在mac os上重写malloc

C++ 在mac os上重写malloc,c++,c,osx-mavericks,llvm-gcc,C++,C,Osx Mavericks,Llvm Gcc,我想使用DYLD_INSERT_库覆盖Mac OS 10.9上程序中的内存分配。这是我实现的代码的一个非常简单的框架: void *(*default_malloc)(size_t) = NULL; void (*default_free)() = NULL; void *(*default_calloc)(size_t, size_t) = NULL; void *(*default_realloc)(void *, size_t) = NULL; void *malloc(size_t s

我想使用DYLD_INSERT_库覆盖Mac OS 10.9上程序中的内存分配。这是我实现的代码的一个非常简单的框架:

void *(*default_malloc)(size_t) = NULL;
void (*default_free)() = NULL;
void *(*default_calloc)(size_t, size_t) = NULL;
void *(*default_realloc)(void *, size_t) = NULL;

void *malloc(size_t size)
{
    if(!default_malloc)
    {       
        default_malloc = dlsym(RTLD_NEXT, "malloc");    
    }

    size_t allocSize = size + 16;
    char *mem = (char *)default_malloc(allocSize);
    malloc_printf("malloc returned %p\n", mem + 16);
   return mem + 16;
}

void *calloc(size_t num, size_t size)
{
    if(!default_calloc)
    {
        default_calloc = dlsym(RTLD_NEXT, "calloc");
    }

    void *p = malloc(num*size);
    memset(p, 0, num*size); 
    malloc_printf("calloc function returned %p\n", p);
    return p;
}

void *realloc(void *xp, size_t size)
{
    if(!default_realloc)
    {
        default_realloc = dlsym(RTLD_NEXT, "realloc");
    }

    char *p = (char *)default_realloc((char *)xp - 16, size + 16);
    malloc_printf("realloc function returned %p\n", p + 16);
    return p + 16;  
}

void free(void *buff)
{
    if(buff == NULL)
    return;

    if(!default_free)
    {
        default_free = dlsym(RTLD_NEXT, "free");
    }

    char *mem = buff;
    malloc_printf("free function called for %p\n", mem);
    default_free(mem - 16);
}
我不确定这里出了什么问题。当我用它运行我的程序时,我得到以下输出:

$ DYLD_INSERT_LIBRARIES=lib_overrides.dylib ls
ls(2431) malloc: malloc returned 0x7fa6b0400030
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b0400110
ls(2431) malloc: malloc returned 0x7fa6b0400130
ls(2431) malloc: free function called for 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04003c0
ls(2431) malloc: free function called for 0x7fa6b04003e0
ls(2431) malloc: *** error for object 0x7fa6b04003e0: pointer being freed was not allocated
free
如何获取指针
0x7FA6B0403E0
?日志显示,
malloc
不会在任何地方返回它。我已经检查了代码很多次,但是找不到问题所在。非常感谢您的帮助。 请帮忙


注意:如果我停止从分配函数中加16,从空闲函数中减去16,那么一切都正常。那么这是否意味着这里没有覆盖其他分配函数(除了malloc/calloc/realloc)

realloc和free可以并将使用空指针调用。显然,在安装这些函数之前分配的任何内容和之后释放的任何内容都会遇到麻烦


相反,请查看仪器和调试功能

但是,我已经处理了空在自由。另外,lib应该在libc之前加载,那么在安装这些函数之前如何分配一些内容呢?所有需要内存的东西都调用malloc。例如,strdup。打开文件将分配内存,关闭文件将释放内存。等等。检查