Я недавно обнаружил PageHeap, средство отладки Windows. Его вариант / неисправности позволяет вводить сбой выделения памяти время от времени. Мол, я хочу, чтобы 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()
рутина.
Я предполагаю, что есть предварительно скомпилированные версии выше с более широкими возможностями отладки, но вы поняли идею.
О, и кстати, приведенный выше код не проверен (написано в Переполнение стека). Это также не безопасно, а также Вы должны быть в безопасности потока если заменить malloc (), то вы захотите использовать pthread_once()
и pthread_mutex
API, чтобы исправить это.
Вы должны быть в состоянии написать свой собственный. Взгляни на: Маллок Хукс.