ИМЯ
mtrace, muntrace - трассировка mallocLIBRARY
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 <[email protected]>, Alexey <[email protected]>, Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, ITriskTI <[email protected]>, Max Is <[email protected]>, Yuri Kozlov <[email protected]>, Иван Павлов <[email protected]> и Малянов Евгений Викторович <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]15 декабря 2022 г. | Linux man-pages 6.03 |