Вопрос:

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

c linux unit-testing gcc memory-management

6506 просмотра

11 ответа

639 Репутация автора

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

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

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

Автор: Omer Zak Источник Размещён: 20.09.2008 06:56

Ответы (11)


13 плюса

200626 Репутация автора

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

Автор: Vinko Vrsalovic Размещён: 20.09.2008 06:59

5 плюса

2068 Репутация автора

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

Автор: Allan Wind Размещён: 20.09.2008 06:59

3 плюса

6708 Репутация автора

Я могу дать конкретную версию 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>

и т.п.

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

Автор: terminus Размещён: 20.09.2008 07:00

22 плюса

13239 Репутация автора

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

Пример:

ulimit -m 64

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

Автор: freespace Размещён: 20.09.2008 07:01

0 плюса

24522 Репутация автора

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

помощь ulimit
в командной строке bash.

Автор: jfm3 Размещён: 20.09.2008 07:02

1 плюс

200626 Репутация автора

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

Автор: Vinko Vrsalovic Размещён: 20.09.2008 07:08

0 плюса

5266 Репутация автора

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

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

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

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

Автор: rlerallut Размещён: 22.09.2008 05:05

7 плюса

2630 Репутация автора

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

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

Автор: ChrisInEdmonton Размещён: 23.09.2008 05:12

0 плюса

24167 Репутация автора

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

Автор: John D. Cook Размещён: 19.10.2008 02:18

0 плюса

7367 Репутация автора

Посмотрите, как это делает sqlite3 . Они выполняют обширное модульное тестирование, в том числе тестирование вне памяти.

Вы также можете посмотреть их страницу на malloc , в частности раздел 4.0 .

Автор: a_m0d Размещён: 26.05.2010 06:34

0 плюса

509 Репутация автора

Вы можете настроить определение в файле заголовка, чтобы возвращать NULL всякий раз, когда используется malloc:

Обычно malloc будет защищен следующим образом:

if ((int *x = malloc(sizeof(int))) == 0)
   return NULL;

Поэтому вы используете определение для принудительного возврата NULL; пример псевдокода:

# define if(malloc(x))   if(1)

И проверьте, есть ли у вас segfault

Автор: Antonin GAVREL Размещён: 05.11.2018 08:02
Вопросы из категории :
32x32