Provided by: manpages-ru-dev_4.21.0-2_all 

ИМЯ
mtrace, muntrace - трассировка malloc
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#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 <stdio.h>
#include <stdlib.h>
int
main(void)
{
mtrace();
for (unsigned int j = 0; j < 2; j++)
malloc(100); /* Never freed--a memory leak */
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)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Alexey
<a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>,
Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович
<maljanow@outlook.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 15 декабря 2022 г. mtrace(3)