Книга: Linux программирование в примерах

15.5.2.1. GNU/Linux mtrace

15.5.2.1. GNU/Linux mtrace

Системы GNU/Linux, использующие GLIBC, предоставляют две функции для включения и отключения трассировки памяти во время исполнения.

#include <mcheck.h> /* GLIBC */
void mtrace(void);
void muntrace(void);

Когда вызывается mtrace(), библиотека проверяет переменную окружения MALLOC_TRACE. Ожидается, что она указывает на записываемый файл (существующий или нет). Библиотека открывает файл и начинает записывать сведения о выделениях и освобождениях памяти (Если файл не может быть открыт, запись не производится. Файл урезается каждый раз при запуске программы.) Когда вызывается muntrace(), библиотека закрывает файл и больше не регистрирует выделения и освобождения.

Использование отдельных функций дает возможность проводить трассировку памяти для определенных частей программы; необязательно отслеживать все. (Мы нашли наиболее полезным включить журналирование в начале программы и все, но эта схема предоставляет гибкость, которую хорошо иметь.)

Когда приложение завершается, вы используете программу mtrace для анализа файла журнала. (Файл журнала в формате ASCII, но информацию нельзя использовать непосредственно.) Например, gawk включает трассировку, если определена TIDYMEM:

$ export TIDYMEM=1 MALLOC_TRACE=trace.out /* Экспортировать переменные окружения */
$ ./gawk 'BEGIN { print "hello, world" }' /* Запустить программу */
hello, world
$ mtrace ./gawk mtrace.out /* Создать отчет */
Memory not freed:
-----------------
Address Size Caller
0x08085858 0x20  at /home/arnold/Gnu/gawk/gawk-3.1.3/main.c:1102
0x08085880 0xc80 at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:398
0x08086508 0x2   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086518 0x6   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086528 0x10  at /home/arnold/Gnu/gawk/gawk-3.1.3/eval.c:2082
0x08086550 0x3   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.с:337
0x08086560 0x3   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x080865e0 0x4   at /home/arnold/Gnu/gawk/gawk-3.1.3/field.c:76
0x08086670 0x78  at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1369
0x08086700 0xe   at /home/arnold/Gnu/gawk/gawk-3.1.3/node.c:337
0x08086718 0x1f  at /home/arnold/Gnu/gawk/gawk-3.1.3/awkgram.y:1259

Вывод представляет собой список мест, в которых gawk выделяет память, которая в дальнейшем не освобождается. Обратите внимание, что постоянное подвешивание к динамической памяти является замечательным, если это сделано намеренно. Все показанные здесь случаи являются выделениями такого рода.

Оглавление книги


Генерация: 0.082. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз