Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>cc -g ch15-badmem1.c -о ch15-badmem1</b> /* Компилировать как обычно */$ <b>ef ch15-badmem1 -b</b> /* Запустить с использованием ef, создает дамп ядра */Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens <[email protected]>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, снова создает дамп ядра */Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens <[email protected]>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.28007GNU/Linux создает файлы
corecore$ <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:1818 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.с:2121 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 предоставляет глобальные переменные с такими же названиями. Вы можете изменить их значения из отладчика, так что можно динамически изменять поведение программы, которая уже начала выполнение. Подробности см. в efence(3).
15.5.2.3. Отладка Malloc:
dmallocБиблиотека
dmallocБиблиотека
dmallocDMALLOC_OPTIONS$ <b>echo $DMALLOC_OPTIONS</b>debug=0x4e40503,inter=100,log=dm-logКомпонент '
debugПервый шаг заключается в определении функции оболочки с названием
dmallocdmalloc$ <b>dmalloc() {</b>> <b>eval 'command dmalloc -b $*'</b> /* Команда 'command' обходит функции оболочки */> <b>}</b>После того, как это сделано, вы можете передать функции опции для установки файла журнала (-1), указать число итераций, после которых
dmalloclow$ <b>dmalloc -1 dm-log -i 100 low</b>Как и Electric Fence, библиотека
dmallocLD_PRELOAD$ <b>LD_PRELOAD=libdmalloc.so ch15-badmem1 -b</b> /* Запустить с проверкой */p = <not 30 bytes> /* Показан нормальный вывод */ЗАМЕЧАНИЕ. Не используйте '
export LD_PRELOAD=libdmalloc.solsmalloc()unset LD_PRELOAD