А.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).
Код библиотеки требуется загрузить и инсталлировать самостоятельно. Дистрибутив можно найти по адресу
последних нескольких строках показана цепочка вызовов функций, в которых была выделена, но не освобождена память.
Если необходимо, чтобы библиотека
ccmalloc
отслеживала операции записи в память вне выделенной области, придется модифицировать файл .
ccmalloc
. расположенный в текущем каталоге. Этот файл проверяется при запуске программы.
А.2.5. Библиотека Electric Fence
Библиотека Electric Fence, написанная Брюсом Перензом (Bruce Perens), останавливает выполнение программы в той строке, где происходит обращение к памяти за пределами выделенной области. Это единственное средство, позволяющее выявить неправильные операции чтения. Библиотека входит в большинство дистрибутивов Linux, а ее исходные коды можно найти по адресу