Как заставить программу показывать нехватку памяти? - PullRequest
29 голосов
/ 04 августа 2009

У меня есть программа на C / C ++, которая может зависать, когда ей не хватает памяти. Мы обнаружили это, запустив много копий одновременно. Я хочу отладить программу без полного снижения производительности на компьютере разработчика. Есть ли способ ограничить доступную память, чтобы new или malloc возвращали указатель NULL после, скажем, 500K запрошенной памяти?

Ответы [ 9 ]

31 голосов
/ 04 августа 2009

Попробуйте перевернуть вопрос с ног на голову и спросить, как ограничить объем памяти, который ОС позволит использовать вашему процессу.

Попробуйте заглянуть в http://ss64.com/bash/ulimit.html

Попробуй сказать: ulimit -v

Вот еще одна ссылка, которая немного устарела, но дает немного больше оснований: http://www.network -theory.co.uk / Docs / gccintro / gccintro_77.html

9 голосов
/ 04 августа 2009

Один из способов - написать обертку вокруг malloc ().

static unsigned int requested =0;

void* my_malloc(size_tamount){

   if (requested + amount < LIMIT){
       requested+=amount;
       return malloc(amount);
   }

   return NULL
}

Вы можете использовать #define для перегрузки вашего malloc.

Как заявляет GMan, вы также можете перегрузить операторы new / delete (для случая C ++).

Не уверен, что это лучший способ или то, что вы ищете

5 голосов
/ 04 августа 2009
  • Какая ОС? Для Unix смотрите ulimit -d / limit datasize в зависимости от вашей оболочки (sh / csh).

  • Вы можете написать оболочку для malloc, которая возвращает ошибку в желаемое обстоятельство. В зависимости от вашей ОС вы можете заменить ее на реализацию.

3 голосов
/ 05 августа 2009

Другой способ сделать это - использовать failmalloc , который является общей библиотекой, которая переопределяет malloc и т. Д., А затем завершается ошибкой :-). Он дает вам контроль над тем, когда происходит сбой, и может вызывать случайные сбои, каждый раз и т. Д.

Я не использовал это сам, но слышал хорошие вещи.

3 голосов
/ 04 августа 2009

Переопределить новое и новое [].

void* operator new(size_t s)
{
}
void* operator new[](size_t s)
{
}

Поместите свой собственный код в фигурные скобки, чтобы выборочно умереть после Х числа обращений к новым. Обычно вы вызываете malloc для выделения памяти и ее возврата.

3 голосов
/ 04 августа 2009

Это зависит от вашей платформы. Например, это может быть достигнуто программно на Unix-подобных платформах с использованием setrlimit (RLIMIT_DATA, ...) .

EDIT

Ресурс RLIMIT_AS также может быть полезен в этом случае.

2 голосов
/ 04 августа 2009

Однажды у меня был студент в CS 1 (в C, да, да, не по моей вине), попробуйте это, и не хватило памяти:

int array[42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42]..... (42 dimensions);

и тогда он хотел знать, почему это дает ошибки ...

1 голос
/ 04 августа 2009

Насколько я знаю, в Linux malloc никогда не будет возвращать нулевой указатель. Вместо этого будет вызван OOM Killer . Это, конечно, если вы не отключили OOM Killer. Некоторый поиск в Google должен дать результат.

Я знаю, что это не ваш настоящий вопрос, но это имеет отношение к тому, откуда вы пришли.

1 голос
/ 04 августа 2009

Если вы хотите потратить деньги, есть инструмент под названием Holodeck от SecurityInnovations, который позволяет вам вводить ошибки в вашу программу (включая недостаток памяти). Приятно то, что вы можете включать и выключать вещи по желанию. Я не очень-то этим пользовался, поэтому не знаю, возможно ли программировать ошибки в определенных точках с помощью инструмента. Я также не знаю, какие платформы поддерживаются ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...