Шрифт:
Библиотека
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: flags = 0x4e40503, logfile 'dm-log'
1062078174: 1: interval = 100, addr = 0, seen # = 0
1062078174: 1: starting time = 1062078174
1062078174: 1: free bucket count/bits: 63/6
1062078174: 1: basic-block 4096 bytes, alignment 8 bytes, heap grows up
1062078174: 1: heap: 0x804a000 to 0x804d000, size 12288 bytes (3 blocks)
1062078174: 1: heap checked 0
1062078174: 1: alloc calls: malloc 1, calloc 0, realloc 0, free 0
1062078174: 1: alloc calls: recalloc 0, memalign 0, valloc 0
1062078174: 1: total memory allocated: 30 bytes (1 pnts)
1062078174: 1: max in use at one time: 30 bytes (1 pnts)
1062078174: 1: max alloced with 1 call: 30 bytes
1062078174: 1: max alloc rounding loss: 34 bytes (53%)
1062078174: 1: max memory space wasted: 3998 bytes (98%)
1062078174: 1: final user memory space: basic 0, divided 1, 4062 bytes
1062078174: 1: final admin overhead: basic 1, divided 1, 8192 bytes (66%)
1062078174: 1: final external space: 0 bytes (0 blocks)
1062078174: 1: top 10 allocations:
1062078174: 1: total-size count in-use-size count source
1062078174: 1: 30 1 30 1 ra=0x8048412
1062078174: 1: 30 1 30 1 Total of 1
1062078174: 1: dumping not-freed pointers changed since 0:
1062078174: 1: not freed: '0x804c008|s1' (30 bytes) from 'ra=0x8048412'
1062078174: 1: total-size count source
1062078174: 1: 30 1 ra=0x8048412 /* Выделение здесь */
1062078174: 1: 30 1 Total of 1
1062078174: 1: unknown memory: 1 pointer, 30 bytes
1062078174: 1: ending time = 1062078174, elapsed since start = 0:00:00
Вывод содержит много статистических данных, которые нам пока не интересны. Интересна строка, в которой указывается не освобожденная память, с адресом возврата, указывающим на выделившую память функцию ('
ra=0х8048412
'). Документация dmalloc
объясняет, как получить расположение в исходном коде этого адреса с использованием GDB.