.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 2012 by Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mtrace 3 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ mtrace, muntrace \- трассировка malloc .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBvoid mtrace(void);\fP \fBvoid muntrace(void);\fP .fi .SH ОПИСАНИЕ Функция \fBmtrace\fP() устанавливает перехватывающие функции (hook functions) на функции выделения памяти (\fBmalloc\fP(3), \fBrealloc\fP(3), \fBmemalign\fP(3), \fBfree\fP(3)). Эти перехватывающие функции записывают трассировочную информация о выделении и освобождении памяти. Информация о трассировке может использоваться в программе для обнаружения утечек памяти и попыток освобождения не выделенной памяти. .P Функция \fBmuntrace\fP() отключает перехватывающие функции, установленные \fBmtrace\fP() и трассировка функций выделения памяти больше не выполняется. Если \fBmtrace\fP() не установила перехватывающие функции, то \fBmuntrace\fP() ничего не делает. .P При вызове \fBmtrace\fP() она проверяет значение переменной окружения \fBMALLOC_TRACE\fP, в которой должен содержаться путь к файлу для записи информации о трассировке. При открытии этого файла он обрезается до нулевой длины. .P Если \fBMALLOC_TRACE\fP не существует или указанный путь некорректен или недоступен для записи, то перехватывающие функции не устанавливаются и \fBmtrace\fP() ничего не делает. Для программ с установленными set\-user\-ID и set\-group\-ID переменная \fBMALLOC_TRACE\fP игнорируется и \fBmtrace\fP() ничего не делает. .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBmtrace\fP(), \fBmuntrace\fP() T} Безвредность в нитях MT\-Unsafe .TE .\" FIXME: The marking is different from that in the glibc manual, .\" markings in glibc manual are more detailed: .\" .\" mtrace: MT-Unsafe env race:mtrace const:malloc_hooks init .\" muntrace: MT-Unsafe race:mtrace const:malloc_hooks locale .\" .\" But there is something wrong in glibc manual, for example: .\" glibc manual says muntrace should have marking locale because it calls .\" fprintf(), but muntrace does not execute area which cause locale problem. .SH СТАНДАРТЫ GNU. .SH ЗАМЕЧАНИЯ В обычной работе \fBmtrace\fP() вызывается один раз в начале выполнения программы, а \fBmuntrace\fP() никогда не вызывается. .P Результат трассировки после вызова \fBmtrace\fP() имеет текстовый формат, не предназначенный для чтения человеком. В библиотеке GNU C есть сценарий Perl, \fBmtrace\fP(1), который преобразует журнал трассировки в читаемый вид. Для лучших результатов трассируемая программа должна быть скомпилирована с включённой отладкой для того, чтобы в исполняемый файл попала информация c номерами строк. .P Трассировка, выполняемая \fBmtrace\fP(), ухудшает производительность (если \fBMALLOC_TRACE\fP указывает на корректный, доступный на запись файл). .SH ДЕФЕКТЫ Информация о номере строки, выдаваемая в \fBmtrace\fP(1), не всегда точна: номер строки может ссылаться на предыдущую или следующую (не пустую) строку исходного кода. .SH ПРИМЕРЫ Далее представлен пример работы функции \fBmtrace\fP() и команды \fBmtrace\fP(1) для программы с утечкой памяти в двух местах. Для демонстрации используется следующая программа: .P .in +4n .\" [[memory leak]] SRC BEGIN (t_mtrace.c) $ \fBcat t_mtrace.c\fP .EX #include #include #include \& int main(void) { mtrace(); \& for (unsigned int j = 0; j < 2; j++) malloc(100); /* Never freed\-\-a memory leak */ \& calloc(16, 16); /* Never freed\-\-a memory leak */ exit(EXIT_SUCCESS); } .EE .\" SRC END .in .P При выполнении этой программы мы видим, что \fBmtrace\fP() обнаружила утечку памяти в двух местах программы: .P .in +4n .EX $ \fBcc \-g t_mtrace.c \-o t_mtrace\fP $ \fBexport MALLOC_TRACE=/tmp/t\fP $ \fB./t_mtrace\fP $ \fBmtrace ./t_mtrace $MALLOC_TRACE\fP 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 .EE .in .P Первые два сообщения о не освобожденной памяти относятся к двум вызовам \fBmalloc\fP(3), сделанным внутри цикла \fIfor\fP. Заключительное сообщение относится к вызову \fBcalloc\fP(3) (которая, в свою очередь, вызывает \fBmalloc\fP(3)). .SH "СМ. ТАКЖЕ" \fBmtrace\fP(1), \fBmalloc\fP(3), \fBmalloc_hook\fP(3), \fBmcheck\fP(3) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .