dmalloc — библиотека для выявления проблем работы с памятью — утечек памяти, обращение к областям памяти за границами выделенных блоков (также как и Electric Fence), а также сбор различной статистики по выделению памяти. Данная библиотека переопределяет стандартные функции выделения и освобождения памяти. Библиотека написана в портабельном стиле, и может быть использована на Linux, Solaris и других Unix-совместимых системах, включая MS Windows (в среде Cygwin)1.
На мой взгляд, в настоящее время использование данной библиотеки не особо оправдано, поскольку имеются более мощные альтернативы — Valgrind и Google Performance Tools.
Также как и многие пакеты для Unix, dmalloc
собирается достаточно просто — необходимо
скачать исходные тексты с сайта, распаковать и выполнить три команды:
./configure make make install
Если вы будете использовать dmalloc
с многопоточными программами, то вам нужно будет
передать параметр --enable-threads
скрипту configure
.
Также как и другие пакеты, предназначенные для поиска ошибок работы с памятью,
использовать dmalloc
очень просто — вам нужно слинковать библиотеку с программой, или
загрузить ее с помощью LD_PRELOAD
.2 Стоит отметить, что существует две версии библиотеки:
для программ на языке C —
libdmalloc
, и для программ на C++ —
libdmallocthcxx
.3 Вторая
библиотека кроме поддержки стандартных malloc
& free
, также поддерживает операторы C++ для
работы с памятью —
new
, new []
и т.п.
Аналогично другим пакетам, libdmalloc
также получает информацию о настройках из переменных
среды. Некоторым отличием является то, что в состав пакета входит командно-строковая
утилита dmalloc
, которую можно использовать для установки конкретных переменных, не
указывая их имен и не вдаваясь в особенности синтаксиса командного процессора4. В типовой
ситуации, dmalloc
используется следующим образом:
eval `dmalloc -b options debug_level` LD_PRELOAD=libmalloc.so.4 ./your-program
наличие команды eval
необходимо, поскольку если просто вызвать dmalloc
, то он выведет на
экран команды устанавливающую переменную среды DMALLOC_OPTIONS
, а не установит их5. В
зависимости от используемого командного процессора dmalloc
необходимо указать конкретную
опцию: -b
для процессоров, совместимых по синтаксису с sh
—
bash
, zsh
и другие, и -c
для
использующих csh
-совместимый синтаксис.
Кроме того, пользователь должен указать уровень подробности с которой будет проводиться
проверка (debug level). Существует несколько предопределенных значений (low
, runtime
,
medium
и high
) которые задают предопределенные наборы проверок (от минимальных до
максимальных), но пользователь может задать и собственные наборы проверок, используя опцию
-d
утилиты dmalloc
для задания числа, описывающего нужные проверки, или опцию -p
, которая
позволяет задать проверки используя их имена, например:
eval `dmalloc -d 0 -l log_file -p log-non-free -p check-fence -p check-funcs`
В данном случае, опция -d
обнуляет выставленные флаги, а затем с помощью опций -p
формируется новый набор флагов проверок6. Полный список доступных проверок можно
получить передав dmalloc
опции -DV
, что приведет к выводу названий проверок, их кратких
описаний, а также числовых значений, им соответствующих.
Среди других опций, передаваемых dmalloc
, наиболее часто используемой является опция -l
(или --logfile
), которая позволяет указать имя файла в который будет выводиться отчет.
После завершения работы анализируемой программы в указанном файле мы получим информацию об ошибках, найденных во время работы. В приведенном ниже примере, программа предпринимала попытку освободить уже освобожденный блок памяти, что и было указано в предпоследней строке отчета7:
..... описание параметров, переданных libdmalloc 1204541422: 3: ERROR: free: cannot locate pointer in heap (err 22) 1204541422: 3: error details: finding address in heap 1204541422: 3: pointer '0xb7fc8ff0' from 'test-double-free.c:7' prev access 'unknown'
Если в программе имеются ошибки, приводящие к утечкам памяти, то в отчете появятся строки, подобные приведенным в примере:
1204542221: 3: Dumping Not-Freed Pointers Changed Since Start: 1204542221: 3: not freed: '0xb7fdffc8|s1' (10 bytes) from 'test-memleak.c:6' 1204542221: 3: total-size count source 1204542221: 3: 10 1 test-memleak.c:6 1204542221: 3: 10 1 Total of 1
Помимо вывода данных о найденных ошибках, libdmalloc
выводит данные о выделении памяти,
количестве вызовов конкретных функций и т.п. вещах, например:
1204542469: 3: Dumping Chunk Statistics: 1204542469: 3: basic-block 4096 bytes, alignment 8 bytes 1204542469: 3: heap address range: 0xb7f01000 to 0xb7f0a000, 36864 bytes 1204542469: 3: user blocks: 1 blocks, 4074 bytes (11%) 1204542469: 3: admin blocks: 8 blocks, 32768 bytes (89%) 1204542469: 3: total blocks: 9 blocks, 36864 bytes 1204542469: 3: heap checked 0 1204542469: 3: alloc calls: malloc 2, calloc 0, realloc 0, free 1 1204542469: 3: alloc calls: recalloc 0, memalign 0, valloc 0 1204542469: 3: alloc calls: new 0, delete 0 1204542469: 3: current memory in use: 10 bytes (1 pnts) 1204542469: 3: total memory allocated: 20 bytes (2 pnts) 1204542469: 3: max in use at one time: 10 bytes (1 pnts) 1204542469: 3: max alloced with 1 call: 10 bytes 1204542469: 3: max unused memory space: 22 bytes (68%) 1204542469: 3: top 10 allocations: 1204542469: 3: total-size count in-use-size count source 1204542469: 3: 10 1 10 1 test-memleak.c:6 1204542469: 3: 10 1 0 0 test-memleak.c:4 1204542469: 3: 20 2 10 1 Total of 2
1. Библиотека может использоваться для выявления проблем и в многопоточных программах.
2. Для получения детальной информации об файлах с исходными текстами и конкретных
строках, вызвавших появление ошибок, пользователь может скомпилировать свою программу
подключив заголовочный файл dmalloc.h
. Об этом можно подробней прочитать в
документации.
3. Библиотеки предназначенные для работы с многопоточных программами имеют суффикс th
,
например: libdmallocth.so.4
4. Пользователь может также задать опции, которые будут использоваться при каждом запуске
<code>dmalloc. Для этого надо указать необходимые опции в файл настройки ~/.dmallocrc
.
5. В документации приводится несколько примеров команд для командного процессора, которые
позволят пользователю не указывать явно команду eval
.
6. Стоит отметить, что при последовательных вызовах dmalloc
происходит сохранение
значений, которые не изменяются текущим вызовом. Пользователь может явно указать на
то, что не указанные значения были удалены, используя опцию -r
, или сохранены, если
задана опция -k
.
7. В данном примере, тестовая программа была скомпилирована с подключением файла <code>dmalloc.h, чтобы библиотека получила данные о номерах строк в файле. В том случае, если вы не можете пересобрать исходные тексты, то вы можете получить информацию о номерах строк используя gdb, как это описано в документации.
Last change: 05.03.2013 16:54