MTRACE(3) Руководство программиста Linux MTRACE(3)

ИМЯ

mtrace, muntrace - трассировка malloc

ОБЗОР

#include <mcheck.h>

void mtrace(void);

void muntrace(void);

ОПИСАНИЕ

Функция mtrace() устанавливает перехватывающие функции (hook functions) на функции выделения памяти (malloc(3), realloc(3), memalign(3), free(3)). Эти перехватывающие функции записывают трассировочную информация о выделении и освобождении памяти. Информация о трассировке может использоваться в программе для обнаружения утечек памяти и попыток освобождения не выделенной памяти.

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

При вызове mtrace() она проверяет значение переменной окружения MALLOC_TRACE, в которой должен содержаться путь к файлу для записи информации о трассировке. При открытии этого файла он обрезается до нулевой длины.

Если MALLOC_TRACE не существует или указанный путь некорректен или недоступен для записи, то перехватывающие функции не устанавливаются и mtrace() ничего не делает. Для программ с установленными set-user-ID и set-group-ID переменная MALLOC_TRACE игнорируется и mtrace() ничего не делает.

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
mtrace(), muntrace() Безвредность в нитях MT-Unsafe

СООТВЕТСТВИЕ СТАНДАРТАМ

Эти функции являются расширениями GNU.

ЗАМЕЧАНИЯ

В обычной работе mtrace() вызывается один раз в начале выполнения программы, а muntrace() никогда не вызывается.

Результат трассировки после вызова mtrace() имеет текстовый формат, не предназначенный для чтения человеком. В библиотеке GNU C есть сценарий Perl, mtrace(1), который преобразует журнал трассировки в читаемый вид. Для лучших результатов трассируемая программа должна быть скомпилирована с включённой отладкой для того, чтобы в исполняемый файл попала информация c номерами строк.

Трассировка, выполняемая mtrace(), ухудшает производительность (если MALLOC_TRACE указывает на корректный, доступный на запись файл).

ДЕФЕКТЫ

Информация о номере строки, выдаваемая в mtrace(1), не всегда точна: номер строки может ссылаться на предыдущую или следующую (не пустую) строку исходного кода.

ПРИМЕР

Далее представлен пример работы функции mtrace() и команды mtrace(1) для программы с утечкой памяти в двух местах. Для демонстрации используется следующая программа:

$ cat t_mtrace.c
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{

    int j;

    mtrace();

    for (j = 0; j < 2; j++)

        malloc(100);            /* никогда не освобождается — утечка памяти */

    calloc(16, 16);             /* Никогда не освобождается — утечка памяти */

    exit(EXIT_SUCCESS);
}

При выполнении этой программы мы видим, что mtrace() обнаружила утечку памяти в двух местах программы:

$ cc -g t_mtrace.c -o t_mtrace
$ export MALLOC_TRACE=/tmp/t
$ ./t_mtrace
$ mtrace ./t_mtrace $MALLOC_TRACE
Memory not freed:
-----------------

   Address     Size     Caller
0x084c9378     0x64  at /home/cecilia/t_mtrace.c:12
0x084c93e0     0x64  at /home/cecilia/t_mtrace.c:12
0x084c9448    0x100  at /home/cecilia/t_mtrace.c:16

Первые два сообщения о не освобожденной памяти относятся к двум вызовам malloc(3), сделанным внутри цикла for. Заключительное сообщение относится к вызову calloc(3) (которая, в свою очередь, вызывает malloc(3)).

СМОТРИТЕ ТАКЖЕ

mtrace(1), malloc(3), malloc_hook(3), mcheck(3)

2017-09-15 GNU