Как создать случайный сбой выделения памяти?

Недавно я обнаружил PageHeap, инструмент для отладки Windows. Его опция / ошибка позволяет вводить ошибку выделения памяти время от времени. Мол, я хочу, чтобы 1 выделение провалилось каждые 100 или 1000, вы решаете. Есть ли у нас что-то похожее на Linux?

Я могу подумать об ulimit, но это не совсем то же самое, он будет вызывать сбои при каждом последующем выделении памяти, как только будет достигнута память, а не только одна.

2 ответа

Решение

Да, вы можете делать подобные вещи, используя 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, чтобы исправить это.

Вы должны быть в состоянии написать свой собственный. Взгляните на: Маллок Хукс.

Другие вопросы по тегам