2014-02-28 3 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셨어요? 로그가 제안하는대로 어디서나 에 의해 반환되지 않습니다. 코드를 여러 번 검토했지만 문제를 찾을 수 없습니다. 어떤 도움이라도 대단히 감사합니다. 친절히 도와주세요.

참고 : 할당 함수에서 16을 더하지 않고 16을 공짜로 빼면 모든 것이 정상적으로 작동합니다. 그렇다면 여기에 오버라이드되지 않는 다른 할당 함수가 있음을 의미합니까? (malloc/calloc/realloc과 별개로)?

답변

-1

realloc과 free can은 null 포인터로 호출됩니다. 그리고 분명히 이전에 할당 된 것들로 문제가 생기고 이러한 기능을 설치 한 후에 해제됩니다.

악기 및 디버깅 기능을 대신 살펴보십시오.

+0

그러나 무료로 NULL을 처리했습니다. 또한 libc가 libc보다 먼저로드되어야합니다. 그래서이 함수가 설치되기 전에 어떻게 어떤 것이 할당 될 수 있습니까? – Aarkan

+0

메모리를 필요로하는 모든 것이 malloc을 호출합니다. 예를 들어 strdup. 파일을 열면 메모리가 할당되고 파일을 닫으면 메모리가 해제됩니다. Aand 등등. – gnasher729

+0

https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html을 확인하십시오. – gnasher729