Чтение онлайн

ЖАНРЫ

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

А.2.3. Поиск потерянных блоков памяти с помощью утилиты mtrace

Утилита

mtrace
позволяет выявить наиболее распространенную ошибку при работе с динамической памятью: несоответствие числа операций выделения и освобождения памяти. Алгоритм применения утилиты таков.

1. Включите в программу файл

<mcheck.h>
и разместите в самом начале программы вызов функции
mtrace
. Эта функция активизирует трассировку операций выделения и освобождения памяти.

2. Задайте имя файла, в котором будет сохраняться трассировочная информация. Это делается следующим образом:

% export MALLOC_TRACE=memory.log

3. Запустите

программу. Все операции выделения и освобождения памяти будут зарегистрированы в журнальном файле.

4. Вызовите утилиту

mtrace
, которая проверит, совпадает ли число выделенных блоков памяти с числом освобожденных блоков.

% mtrace my_program $MALLOC_TRACE

Сообщения, выдаваемые утилитой

mtrace
, достаточно понятны. Например, в случае программы
malloc-use
будет получена такая информация:

– 0000000000 Free 3 was never alloc'd malloc-use.с:39

Memory not freed:

– ----------------

Address Size Caller

0x08049d48 0xc at malloc-use.с:30

Эти сообщения говорят о том, что в строке 39 файла

malloc-use.c
делается попытка освободить память, которая никогда не была выделена, а память, выделенная в строке 30, так и не была освобождена.

Функция

malloc
заставляет программу фиксировать все операции выделения и освобождения памяти в файле, указанном в переменной среды
MALLOC_TRACE
. Чтобы данные были записаны в файл, программа должна завершиться нормальным образом. Утилита
mtrace
анализирует этот файл и находит в нем непарные записи.

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

Поделиться с друзьями: