Меню:


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 для процессоров, совместимых по синтаксису с shbash, 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

blog comments powered by Disqus