2014-02-28 108 views
0

我想在我的程序中使用DYLD_INSERT_LIBRARIES重寫Mac OS 10.9中的內存分配。這是我已經實現的代碼的一個非常簡單的骨架:在Mac OS上重寫malloc

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得到的指針0x7fa6b04003e0?根據日誌提示,它不會在任何地方由malloc返回。我已經多次查看代碼,但無法找到問題。任何幫助深表感謝。 請幫忙。

注意:如果我停止從分配函數中添加16並從免費中減去16,那麼一切工作正常。那麼這是否意味着有一些其他的分配函數在這裏沒有被覆蓋(除了malloc/calloc/realloc之外)?

回答

-1

realloc和空閒can和將被調用空指針。顯然,如果你安裝了這些功能,你就會遇到以前分配過的任何問題,並且會釋放它。

改爲查看儀器和調試功能。

+0

但是,我已經免費處理NULL。另外,lib應該在libc之前加載,那麼在安裝這些函數之前如何分配一些東西呢? – Aarkan

+0

所有需要內存調用的malloc。例如,strdup。打開文件將分配內存並關閉文件將釋放它。 Aand等。 – gnasher729

+0

檢查https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html – gnasher729