Выбрать главу

А.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.