А.2.4. Библиотека ccmalloc
Библиотека ccmalloc замещает функции malloc() и free() кодом трассировки. Если программа завершается успешно, создается отчет о потерянных блоках памяти и прочих ошибках. Библиотеку ccmalloc написал Армин Бир (Armin Biere).
Код библиотеки требуется загрузить и инсталлировать самостоятельно. Дистрибутив можно найти по адресу http://www.inf.ethz.ch/personal/biere/projects/ccmalloc. Распакуйте дистрибутив и запустите сценарий configure. Далее выполните команды make и make install, скопируйте файл ccmalloc.cfg в каталог, из которого будет запускаться проверяемая программа, и переименуйте копию в .ccmalloc.
К объектным файлам программы необходимо подключить библиотеку ccmalloc и библиотеку функций динамической компоновки, Вот как это делается:
% gcc -g -Wall -pedantic malloc-use.o -о ccmalloc-use -lccmalloc -ldl
Запустите программу, чтобы получить отчет. Например, если попросить программу malloc-use выделить память и забыть ее освободить, будут выданы следующие результаты:
% ./ccmalloc-use 12
file-name=a.out does not contain valid symbols
trying to find executable in current directory ...
using symbols from 'ccmalloc-use'
(to speed up this search specify 'file ccmalloc-use'
in the startup file '.ccmalloc')
Please enter a command: a 0 12
Please enter a command: q
.-----------------.
| ccmalloc report |
=====================================================
| total # of | allocated | deallocated | garbage |
+-------------+-----------+-------------+------------+
| bytes | 60 | 48 | 12 |
+-------------+-----------+-------------+------------+
| allocations | 2 | 1 | 1 |
+----------------------------------------------------+
| number of checks: 1 |
| number of counts: 3 |
| retrieving function names for addresses ... done. |
| reading file info from gdb ... done. |
| sorting by number of not reclaimed bytes ... done. |
| number of call chains: 1 |
| number of ignored call chains: 0 |
| number of reported call chains: 1 |
| number of internal call chains: 1 |
| number of library call chains: 0 |
=====================================================
|
*100.0% = 12 Bytes of garbage allocated in 1 allocation
| |
| | 0x400389cb in <???>
| |
| | 0x08045198 in <main>
| | at malloc-use.с:89
| |
| | 0x06048fdc in <allocate>
| | at malloc-use.c:30
| |
| '-----> 0x08049647 in <malloc>
| at src/wrapper.c:284
'------------------------------------------------------
В последних нескольких строках показана цепочка вызовов функций, в которых была выделена, но не освобождена память.
Если необходимо, чтобы библиотека ccmalloc отслеживала операции записи в память вне выделенной области, придется модифицировать файл .ccmalloc. расположенный в текущем каталоге. Этот файл проверяется при запуске программы.
А.2.5. Библиотека Electric Fence
Библиотека Electric Fence, написанная Брюсом Перензом (Bruce Perens), останавливает выполнение программы в той строке, где происходит обращение к памяти за пределами выделенной области. Это единственное средство, позволяющее выявить неправильные операции чтения. Библиотека входит в большинство дистрибутивов Linux, а ее исходные коды можно найти по адресу http://www.perens.com/FreeSoftware.
Как и в случае библиотеки ccmalloc, к объектным файлам программы необходимо подключить код библиотеки Electric Fence:
% gcc -g -Wall -pedantic malloc-use.o -o emalloc-use -lefence
После запуска программы библиотека проверяет правильность обращений к выделенной памяти. В случае нарушения возникает ошибка сегментации:
% ./emalloc-use 12
Electric Fence 2.0.5 Copyright (C) 1987-1998 Bruce Perens.
Please enter a command a 0 12
Please enter a command r 0 12
Segmentation fault
Контекст неправильной операции можно определить с помощью отладчика.
По умолчанию библиотека Electric Fence выявляет только обращения к памяти после выделенной области. Если необходимо, чтобы она находила только обращения к памяти по адресам, предшествующим началу выделенной области, введите такую команду:
% export EF_PROTECT_BELOW=1
Чтобы библиотека отслеживала доступ к освобожденным областям, задайте переменную EF_PROTECT_FREE равной 1. Дополнительные возможности описаны на man-странице libefence.