$ <b>cc -g ch15-badmem1.c -о ch15-badmem1</b> /* Компилировать как обычно */
$ <b>ef ch15-badmem1 -b</b> /* Запустить с использованием ef, создает дамп ядра */
p = <not 30 bytes>
/usr/bin/ef: line 20: 28005 Segmentation fault (core dumped)
( export LD_PRELOAD=libefence.so.0.0; exec $* )
$ <b>ef ch15-badmem1 -f</b> /* Запустить с использованием ef, снова создает дамп ядра */
p = <not 30 bytes>
/usr/bin/ef: line 20: 28007 Segmentation fault (core dumped)
( export LD_PRELOAD=libefence.so.0.0; exec $* )
$ <b>ls -l core*</b> /* Linux создает для нас разные файлы core */
-rw------- 1 arnold devel 217088 Aug 28 15:40 core.28005
-rw------- 1 arnold devel 212992 Aug 28 15:40 core.28007
GNU/Linux создает файлы
core
, которые включают в свое имя ID процесса. В данном случае такое поведение полезно, поскольку мы можем отдельно отлаживать каждый файл
core
:
$ <b>gdb ch15-badmem1 core.28005</b> /* От опции -b */
GNU gdb 5.3
...
Core was generated by 'ch15-badmem1 -b'.
Program terminated with signal 11, Segmentation fault.
...
#0 0x08048466 in main (argc=2, argv=0xbffff8c4) at ch15-badmem1.c:18
18 p[42] = 'a'; /* touch outside the bounds */
(gdb) <b>quit</b>
$ <b>gdb ch15-badmem1 core.28007</b> /* От опции -f */
GNU gdb 5.3
...
Core was generated by 'ch15-badmem1 -f'.
Program terminated with signal 11, Segmentation fault.
...
#0 0x08048498 in main (argc=2, argv=0xbffff8c4) at ch15-badmem1.с:21
21 p[0] = 'b';
Справочная страница efence(3) описывает несколько переменных окружения, которые должны быть установлены, чтобы настроить поведение Electric Fence. Следующие три наиболее примечательны.
EF_PROTECT_BELOW
Установка этой переменной в 1 заставляет Electric Fence проверять «недоборы» (underruns) вместо «переборов» (overruns) при выходе за пределы отведенной памяти. «Перебор», т.е. доступ к памяти в области за выделенной, был продемонстрирован ранее. «Недобор» является доступом к памяти, расположенной перед выделенной областью памяти.
EF_PROTECT_FREE
Установка этой переменной в 1 предотвращает повторное использование Electric Fence памяти, которая была корректно освобождена. Это полезно, когда вы думаете, что программа может получать доступ к освобожденной памяти; если освобожденная память впоследствии была выделена заново, доступ к ней через предыдущий висячий указатель остался бы в противном случае незамеченным.
EF_ALLOW_MALLOC_0
При наличии ненулевого значения Electric Fence допускает вызовы '
malloc(0)
'. Такие вызовы в стандартном С технически действительны, но могут представлять программную ошибку. Соответственно Electric Fence по умолчанию их запрещает.
Вдобавок к переменным окружения Electric Fence предоставляет глобальные переменные с такими же названиями. Вы можете изменить их значения из отладчика, так что можно динамически изменять поведение программы, которая уже начала выполнение. Подробности см. в efence(3).
15.5.2.3. Отладка Malloc:
dmalloc
Библиотека
dmalloc
предоставляет большое число опций отладки. Ее автором является Грей Ватсон (Gray Watson), есть также и свой веб-сайт.
[180] Как и в случае с Electric Fence, она может быть уже установленной на вашей системе, или же вы можете ее извлечь и построить самостоятельно.
Библиотека
dmalloc
проверяет наличие в переменной окружения
DMALLOC_OPTIONS
управляющей информации. Например, она может выглядеть следующим образом:
$ <b>echo $DMALLOC_OPTIONS</b>
debug=0x4e40503,inter=100,log=dm-log
Компонент '
debug
' этой переменной содержит набор битовых флагов, которыми для большинства людей почти невозможно непосредственно управлять. Поэтому документация описывает двухэтапный процесс для облегчения их использования.
Первый шаг заключается в определении функции оболочки с названием
dmalloc
, которая вызывает программу драйвера
dmalloc
:
$ <b>dmalloc() {</b>
> <b>eval 'command dmalloc -b $*'</b> /* Команда 'command' обходит функции оболочки */
> <b>}</b>
После того, как это сделано, вы можете передать функции опции для установки файла журнала (-1), указать число итераций, после которых
dmalloc
должна проверить свои внутренние структуры данных (-1), и указать уровень отладки или другой тэг ('
low
').
$ <b>dmalloc -1 dm-log -i 100 low</b>
Как и Electric Fence, библиотека
dmalloc
может быть скомпонована с приложением статически или связана динамически при помощи
LD_PRELOAD
. Последнее демонстрирует следующий пример:
$ <b>LD_PRELOAD=libdmalloc.so ch15-badmem1 -b</b> /* Запустить с проверкой */
p = <not 30 bytes> /* Показан нормальный вывод */
ЗАМЕЧАНИЕ. Не используйте '
export LD_PRELOAD=libdmalloc.so
'! Если вы это сделаете, каждая программа, которую вы запустите, такая как
ls
, будет выполняться со включенной проверкой
malloc()
. Ваша система быстро станет непригодной. Если вы сделали это случайно, можете использовать '
unset LD_PRELOAD
', чтобы восстановить обычное поведение.