2014-02-19 3 views
0

나는 최근에 Windows 디버깅 도구 인 PageHeap을 발견했습니다. 옵션이 /오류이면 메모리 할당 오류가 발생할 수 있습니다. 1, 100이나 1000을 매번 실패로 할당하는 것이 좋습니다. 우리는 리눅스에서 비슷한 것을 가지고 있습니까?임의의 메모리 할당 오류를 만드는 방법은 무엇입니까?

필자는 ulimit을 생각해 볼 수는 있지만 이것은 똑같은 것은 아니며 메모리에 도달하면 모든 후속 할당이 실패하게됩니다.

답변

1

예, LD_PRELOAD을 사용하여 유사한 작업을 수행 할 수 있습니다. 다음과 같이 컴파일해야합니다.

#include <dlcfn.h> 

void *malloc(size_t size) { 
    static unsigned count = 0; 
    static void *(*real_malloc)(size_t) = NULL; 

    if (!real_malloc) 
    real_malloc = dlsym(RTLD_NEXT, "malloc"); 

    if (++count == 100) { 
    count = 0; 
    return NULL; 
    } 

    return real_malloc (size); 
} 

을 공유 객체로 컴파일해야합니다.

LD_PRELOAD=/path/to/libmy_malloc.so ./my_program 

을하며 교체 malloc() 루틴을 호출합니다 :

gcc -shared -ldl -fPIC my_malloc.c -o libmy_malloc.so 

당신이 그렇게하면, 당신은 다음처럼 프로그램을 실행할 수 있습니다.

위의 미리 빌드 된 버전에 그보다 더 많은 디버깅 기능이 있지만 상상해보십시오.

아, 그런데 위의 코드는 테스트되지 않았습니다 (스택 오버플로로 작성). 또한 스레드 안전하지 않음malloc()을 바꿀 경우 스레드 안전해야하므로 pthread_once()pthread_mutex API를 사용하여 수정해야합니다.

+0

이것은 흥미 롭습니다. 나는 '연산자 new'가이 malloc을 너무 호출한다고 가정 할 수 있습니까? – qdii

+0

@qdii : 아니요,하지만 그걸 바꿀 수는 있습니다. C++에서는 표준이기도하므로'LD_PRELOAD' 해킹이 필요 없습니다. – MSalters

1

자신 만의 글을 쓸 수 있어야합니다. 다음을보십시오 : Malloc Hooks.