Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.