2014-02-19 80 views
0

我最近發現了一個Windows調試工具PageHeap。其選項/錯誤允許每隔一段時間注入內存分配失敗。就像我想要1次分配每100或1000次就會失敗,你決定。我們在linux上有類似的東西嗎?如何創建隨機內存分配失敗?

我可以想到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); 
} 

作爲共享對象,例如,與

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

一旦你這樣做,你可以像這樣運行程序:

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

,它會調用替換malloc()程序。

我想有上述的預建版本,其中有更多的調試功能,但你明白了。

哦,順便說下,上面的代碼沒有經過測試(用Stack Overflow寫)。這也是非線程安全,和你需要線程安全如果更換malloc(),所以你會想要使用pthread_once()pthread_mutex API來解決這個問題。

+0

這很有趣。我可以假設'operator new'也會調用這個malloc嗎? – qdii

+0

@qdii:不,但你可以替換它。它甚至是C++的標準,所以你不需要'LD_PRELOAD'破解。 – MSalters