Вдобавок к переменным окружения Electric Fence предоставляет глобальные переменные с такими же названиями. Вы можете изменить их значения из отладчика, так что можно динамически изменять поведение программы, которая уже начала выполнение. Подробности см. в efence(3).
15.5.2.3. Отладка Malloc:
dmalloc
Библиотека
dmalloc
предоставляет большое число опций отладки. Ее автором является Грей Ватсон (Gray Watson), есть также и свой веб-сайт. [180] Как и в случае с Electric Fence, она
может быть уже установленной на вашей системе, или же вы можете ее извлечь и построить самостоятельно.
180
http://www.dmalloc.com
— Примеч. автора.
Библиотека
dmalloc
проверяет наличие в переменной окружения
DMALLOC_OPTIONS
управляющей информации. Например, она может выглядеть следующим образом:
$ echo $DMALLOC_OPTIONS
debug=0x4e40503,inter=100,log=dm-log
Компонент '
debug
' этой переменной содержит набор битовых флагов, которыми для большинства людей почти невозможно непосредственно управлять. Поэтому документация описывает двухэтапный процесс для облегчения их использования.
Первый шаг заключается в определении функции оболочки с названием
dmalloc
, которая вызывает программу драйвера
dmalloc
:
$ dmalloc {
> eval 'command dmalloc -b $*' /* Команда 'command' обходит функции оболочки */
> }
После того, как это сделано, вы можете передать функции опции для установки файла журнала (-1), указать число итераций, после которых
dmalloc
должна проверить свои внутренние структуры данных (-1), и указать уровень отладки или другой тэг ('
low
').
$ dmalloc -1 dm-log -i 100 low
Как и Electric Fence, библиотека
dmalloc
может быть скомпонована с приложением статически или связана динамически при помощи
LD_PRELOAD
. Последнее демонстрирует следующий пример:
$ LD_PRELOAD=libdmalloc.so ch15-badmem1 -b /* Запустить с проверкой */
p = <not 30 bytes> /* Показан нормальный вывод */
ЗАМЕЧАНИЕ. Не используйте '
export LD_PRELOAD=libdmalloc.so
'! Если вы это сделаете, каждая программа, которую вы запустите, такая как
ls
, будет выполняться со включенной проверкой
malloc
. Ваша система быстро станет непригодной. Если вы сделали это случайно, можете использовать '
unset LD_PRELOAD
', чтобы восстановить обычное поведение.
Результаты записываются в файл
dm-log
следующим образом:
$ cat dm-log
1062078174: 1: Dmalloc version '4.8.1' from 'http://dmalloc.com/'
1062078174: 1: ending time = 1062078174, elapsed since start = 0:00:00
Вывод содержит много статистических данных, которые нам пока не интересны. Интересна строка, в которой указывается не освобожденная память, с адресом возврата, указывающим на выделившую память функцию ('
ra=0х8048412
'). Документация
dmalloc
объясняет, как получить расположение в исходном коде этого адреса с использованием GDB.
$ gdb ch15-badmem1 /* Запустить GDB */
GNU gdb 5.3
...
(gdb) x 0x8048412 /* Проверить адрес */
0x8048412 <main+26>: 0х8910с483
(gdb) info line *(0x8048412) /* Получить сведения о строке */
Line 11 of "ch15-badmem1.с" starts at address 0x8048408 <main+16>
and ends at 0x8048418 <main+32>.
Это трудно, но выполнимо, если нет другого выбора. Однако, если вы включите в свою программу заголовочный файл "
dmalloc.h
" (после всех остальных операторов
#include
), вы можете получить сведения из исходного кода непосредственно в отчете.