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