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

на главную - закладки

Жанры

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

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

Шрифт:

Проверка функции

malloc
очень полезна, потому что программу не нужно перекомпилировать, однако возможности этой проверки весьма ограничены. В основном определяется, не были ли повреждены выделенные структуры данных. Таким образом, сразу же обнаруживаются попытки повторно удалить ту же самую область. Кроме того, выявляется факт записи данных непосредственно перед началом выделенного блока, поскольку его размер хранится именно там. К сожалению, проверка выполняется только тогда, когда программа вызывает функцию
malloc
или
free
, а не когда происходит обращение к памяти. То есть до обнаружения ошибки может произойти множество неправильных операций чтения и записи. В частности, в предыдущем примере ошибка записи была выявлена лишь при попытке освободить выделенную область.

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

Поделиться:
Популярные книги

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Щит і меч

Кожевников Вадим Михайлович
Проза:
военная проза
7.50
рейтинг книги
Щит і меч

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Кожедуб

Бодрихин Николай Георгиевич
1216. Жизнь замечательных людей
Проза:
военная проза
5.00
рейтинг книги
Кожедуб