Mtrace - Mtrace
эта статья содержит инструкции, советы или практические советы.Март 2015 г.) ( |
mtrace
это отладчик памяти включены в Библиотека GNU C.
Использовать
Обратите внимание, что mtrace
инструмент работает только с однопоточными приложениями. Один поток может временно удалить ловушку, в то время как другой поток может одновременно заблокировать память, что приведет к пропущенным выделениям в многопоточном приложении!
Функция mtrace
устанавливает обработчики для маллок
, перераспределить
и свободный
; функция мунтрейс
отключает эти обработчики. Их прототипы, определенный в файле заголовка mcheck.h
, находятся
пустотаmtrace
(пустота
);
пустотамунтрейс
(пустота
);
Обработчики регистрируют все выделения памяти и освобождают их в файл, определенный переменная окружения MALLOC_TRACE (если переменная не установлена, описывает недопустимое имя файла или описывает имя файла, на которое у пользователя нет прав, обработчики не установлены).
А Perl сценарий называется mtrace
, не путать с одноименной функцией, также распространяется с библиотекой GNU C; сценарий анализирует выходной файл и сообщает обо всех выделениях, которые не были освобождены.
Пример использования
Плохой исходный код
Ниже приведен пример плохого исходного кода. Проблема с программой в том, что она выделяет память, но не освобождает ее перед завершением работы.
#включают <stdlib.h>int основной(пустота) { int * а; а = маллок(размер(int)); / * выделяем память и назначаем ее указателю * / вернуть 0; / * мы вышли из программы без освобождения памяти * / / * мы должны были освободить выделенную память с помощью оператора «free (a)» * /}
Использование MTrace
- Установите переменную среды
MALLOC_TRACE
в путь к желаемому выходному файлу. Установка переменных среды немного отличается в каждой оболочке. В Bourne Shell -совместимые оболочки, например Баш, команда выглядит следующим образом:$ MALLOC_TRACE=/home/YourUserName/path/to/program/MallocTraceOutputFile.txt$ экспорт MALLOC_TRACE
- Включают
mcheck.h
в исходном коде. Это делается, например, путем добавления следующей строки в начало C или C ++ файл, как показано ниже:#включают <mcheck.h>
- Вызов функции
mtrace ()
прежде, чем вы начнете выделять память. Обычно проще всего позвонитьmtrace ()
в самом началеглавный()
функция:mtrace();
- Чтобы обозначить конец кода, который следует отслеживать, вызовите функцию
muntrace ()
. Обычно это делается в концеглавный()
функция: мунтрейс();
- Скомпилируйте и запустите программу как обычно. Обратите внимание, что вам нужно скомпилировать
-г
возможность получить полезный результат. В GCC в Linux это можно сделать с помощью следующих команд для C программа:$ gcc yourProgram.c -g$ ./a.out
- Информация об утечке памяти будет сообщена в файле, указанном в
MALLOC_TRACE
переменная окружения. Сложность в том, что этот файл будет в машиночитаемом формате. Большинство машин Linux поставляются с консольной командой под названиемmtrace
, который преобразует компьютерно-читаемый формат в удобочитаемый текст, как показано ниже. Если у вас нет доступа к этой консольной команде, есть Perl сценарий с тем же именем, который можно загрузить для выполнения той же задачи. Вmtrace
синтаксис следующий:$ mtrace
- Например:
$ mtrace a.out MallocTraceOutputFile.txt
mtrace
может использоваться с параллельными вычислениями, но по одному процессу за раз, используя условие ранга, например:если (my_rank==0) mtrace();
Выход MTrace
Если команда mtrace сообщает «Нет утечек памяти», значит, вся память, которая была выделена при последнем выполнении этой программы, также была освобождена, как и должно быть. Если, с другой стороны, mtrace выдает результат, подобный приведенному ниже, это означает, что программисту еще есть над чем поработать.
Память не освобождена: ----------------- Размер адреса Caller0x08049910 0x4 в /home/sureshsathiah/tips/leak.c:9
Хороший исходный код
Ниже приведен пример хорошего исходного кода. Он освобождает память после того, как она выделена, и использует mtrace для уведомления программиста об утечках памяти.
#включают <stdlib.h>#включают <mcheck.h>int основной(пустота) { mtrace(); / * Запускает запись выделения и освобождения памяти * / int* а = НОЛЬ; а = маллок(размер(int)); / * выделяем память и назначаем ее указателю * / если (а == НОЛЬ) { вернуть 1; /* ошибка */ } свободный(а); / * мы освобождаем выделенную память, чтобы не было утечек * / мунтрейс(); вернуть 0; /* выход */}