我最近發現了一個Windows調試工具PageHeap。其選項/錯誤允許每隔一段時間注入內存分配失敗。就像我想要1次分配每100或1000次就會失敗,你決定。我們在linux上有類似的東西嗎?如何創建隨機內存分配失敗?
我可以想到ulimit,但這不是完全相同的事情,它會使每一個後續的分配失敗,一旦達到內存,而不是一個。
我最近發現了一個Windows調試工具PageHeap。其選項/錯誤允許每隔一段時間注入內存分配失敗。就像我想要1次分配每100或1000次就會失敗,你決定。我們在linux上有類似的東西嗎?如何創建隨機內存分配失敗?
我可以想到ulimit,但這不是完全相同的事情,它會使每一個後續的分配失敗,一旦達到內存,而不是一個。
是的,你可以使用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來解決這個問題。
你應該可以自己寫。看看:Malloc Hooks。
這很有趣。我可以假設'operator new'也會調用這個malloc嗎? – qdii
@qdii:不,但你可以替換它。它甚至是C++的標準,所以你不需要'LD_PRELOAD'破解。 – MSalters