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

Как имитировать ошибки выделения памяти

В моем приложении C используются 3 библиотеки, которые выполняют собственное управление памятью. Чтобы быть надежным, мое приложение имеет код для устранения сбоев библиотечных функций из-за отсутствия свободной памяти.

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

Какие инструменты/инструменты рекомендуется для этого? Моя среда - Linux/gcc.

4b9b3361

Ответ 1

Вы можете использовать ulimit, чтобы ограничить количество ресурсов, которые пользователь может использовать, включая память. Таким образом, вы создаете тестового пользователя, ограничиваете использование своей памяти чем-то достаточно, чтобы запустить вашу программу, и наблюдайте, как она умирает:)

Пример:

ulimit -m 64

Устанавливает ограничение на память в 64 КБ.

Ответ 2

Создайте свою собственную оболочку malloc, которая будет случайным образом возвращать null вместо действительного указателя. Ну, или который неуспешно, если вы хотите unit test.

Ответ 3

В операционных системах, которые перекомпилируют память (например, Linux или Windows), просто невозможно обработать ошибки из памяти. malloc может вернуть действительный указатель, а затем, когда вы попытаетесь разыменовать его, ваша операционная система может определить, что вы потеряли память и убили процесс.

http://www.reddit.com/comments/60vys/how_not_to_write_a_shared_library/ является хорошей записью на этом.

Ответ 4

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

Ответ 5

Я могу дать конкретную версию Linux (возможно, POSIX): __malloc_hook, __realloc_hook, __free_hook. Они объявлены в файле malloc.h.

EDIT: небольшая разработка: это указатели на функции (см. malloc.h и их man-страницу для точной декларации), но будьте осторожны: это не совсем стандарты, а просто расширения GNU. Поэтому, если переносимость является проблемой, не используйте это.

Менее менее зависимым от платформы решением может быть то, что вы объявляете макрос malloc. Если вы тестируете, это вызывает крючок и реальный malloc.

memhook.h:

#define malloc(s)    (my_malloc(s))

memhook.c:

#include "memhook.h"
#undef malloc
#include <stdlib.h>

и др.

Вы можете использовать это для обнаружения утечек, случайного сбоя распределения и т.д.

Ответ 6

Кроме того, вы должны использовать Valgrind, чтобы проверить все это и получить реальные полезные отчеты о поведении памяти вашей программы

Ответ 7

Вы хотите команду ulimit в bash. Пытаться

help ulimit
в командной строке bash.

Ответ 8

(В дополнение к некоторым из предыдущих ответов)

Оформить заказ "Электрический забор" на примере библиотеки перехвата malloc, которую вы можете использовать с вашим исполняемым файлом (например, с помощью трюка LD_PRELOAD).

Как только вы перехватили malloc, вы можете использовать все, что хотите, чтобы вызвать сбои. Случайно вызванный сбой был бы хорошим стресс-тестом для различных частей системы. Вы также можете изменить вероятность отказа в зависимости от объема запрашиваемой памяти.

Ваша интересная идея, кстати, явно что-то, что я хотел бы сделать с некоторыми из моего кода...

Ответ 9

Возможно, вам захочется взглянуть на некоторые сайты, ориентированные на восстановление, такие как группа Berkeley/Stanford ROC. Я слышал, как некоторые из этих людей говорили раньше, и они используют код для случайного ввода ошибок во время выполнения C. Там есть ссылка на свой инструмент FIT внизу своей страницы.