2014-02-19 2 views
0

Недавно я обнаружил PageHeap, инструмент отладки Windows. Его опция /ошибка позволяет прерывать распределение памяти каждый раз в то время. Например, я хочу, чтобы 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().

Я предполагаю, что есть предустановленные версии выше с более сложными функциями отладки, но вы получите эту идею.

О, кстати, вышеуказанный код не проверен (написано в Переполнение стека). Также небезопасный поток и необходимо заменить потоковое безопасное, если вы замените malloc(), поэтому вы хотите использовать pthread_once() и API-интерфейсы pthread_mutex, чтобы исправить это.

+0

Это интересно. Могу ли я предположить, что 'operator new' также вызовет этот malloc? – qdii

+0

@qdii: Нет, но вы тоже можете это заменить. Это даже стандартно на C++, поэтому вам не нужен хакер LD_PRELOAD. – MSalters

1

Вы должны иметь возможность написать свой собственный. Взгляните на: Malloc Hooks.

Смежные вопросы