Подтвердить что ты не робот

Как заставить программу появляться в памяти?

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

4b9b3361

Ответ 1

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

Попробуйте найти http://ss64.com/bash/ulimit.html

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

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

Ответ 2

Один из способов - написать обертку вокруг 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 вы можете также перегрузить новые/удалить операторы (для случая С++).

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

Ответ 3

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

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

Ответ 4

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

ИЗМЕНИТЬ

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

Ответ 5

Заменить новые и новые [].

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

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

Ответ 6

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

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

Ответ 7

У меня когда-то был студент в 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);

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

Ответ 8

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

Ответ 9

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

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