mtrace
Эта статья содержит инструкции, советы и инструкции . ( март 2015 г. ) |
mtrace
— отладчик памяти, включенный в библиотеку GNU C.
Использовать
[ редактировать ]Обратите внимание, что mtrace
инструмент работает только с однопоточными приложениями. Один поток может временно удалить перехватчик, в то время как другой поток может одновременно выделить память, что приведет к пропущенному выделению памяти в многопоточном приложении!
Функция mtrace
устанавливает обработчики для malloc
, realloc
и free
; функция muntrace
отключает эти обработчики. Их прототипы , определенные в заголовочном файле mcheck.h
, являются
voidmtrace
(void
);
voidmuntrace
(void
);
Обработчики записывают все выделение и освобождение памяти в файл, определенный переменной среды MALLOC_TRACE (если переменная не установлена, описывает недопустимое имя файла или описывает имя файла, к которому у пользователя нет разрешений, обработчики не устанавливаются).
- скрипт Perl под названием mtrace
, не путать с одноименной функцией, также распространяется вместе с библиотекой GNU C; сценарий анализирует выходной файл и сообщает обо всех выделениях, которые не были освобождены.
Пример использования
[ редактировать ]Плохой исходный код
[ редактировать ]Ниже приведен пример плохого исходного кода. Проблема программы в том, что она выделяет память, но не освобождает ее перед выходом.
#include <stdlib.h>
int main(void) {
int * a;
a = malloc(sizeof(int)); /* allocate memory and assign it to the pointer */
return 0; /* we exited the program without freeing memory */
/* we should have released the allocated memory with the statement “free(a)” */
}
Использование MTrace
[ редактировать ]- Установите переменную среды
MALLOC_TRACE
к пути к желаемому выходному файлу. Установка переменных среды немного отличается в каждой оболочке. В Bourne Shell оболочках, совместимых с , таких как Bash , команда выглядит следующим образом:$ MALLOC_TRACE=/home/YourUserName/path/to/program/MallocTraceOutputFile.txt $ export MALLOC_TRACE
- Включать
mcheck.h
в исходном коде. Это можно сделать, например, добавив следующую строку в начало файла C или C++ , как показано ниже:#include <mcheck.h>
- Вызов функции
mtrace()
прежде чем начать выделять память. Обычно проще позвонитьmtrace()
в самом началеmain()
функция:mtrace();
- Чтобы обозначить конец кода, который необходимо отследить, вызовите функцию
muntrace()
. Обычно это делается в концеmain()
функция: muntrace();
- Скомпилируйте и запустите программу как обычно. Обратите внимание, что вам необходимо скомпилировать с помощью
-g
возможность получить полезный результат. В GCC в Linux это можно сделать с помощью следующих команд для программы C :$ gcc yourProgram.c -g $ ./a.out
- Информация об утечке памяти будет сообщена в файле, указанном
MALLOC_TRACE
переменная среды. Сложность в том, что этот файл будет в формате, читаемом компьютером. Большинство машин Linux поставляются с консольной командой под названиемmtrace
, который преобразует формат, читаемый компьютером, в текст, читаемый человеком, как показано ниже. Если у вас нет доступа к этой консольной команде, существует Perl одноименный сценарий , который можно загрузить для выполнения той же задачи.mtrace
синтаксис следующий:$ mtrace <exec_file_name> <malloc_trace_filename>
- Например:
$ mtrace a.out MallocTraceOutputFile.txt
mtrace
может использоваться с параллельными вычислениями , но по одному процессу за раз, используя условие ранга, например:if (my_rank==0) mtrace();
Вывод MTrace
[ редактировать ]Если команда mtrace сообщает «Нет утечек памяти», то вся память, которая была выделена при последнем выполнении этой программы, также была освобождена, как и должно быть. Если, с другой стороны, mtrace выдает такой результат, как показано ниже, это означает, что программисту еще есть над чем поработать.
Memory not freed: ----------------- Address Size Caller 0x08049910 0x4 at /home/sureshsathiah/tips/leak.c:9
Хороший исходный код
[ редактировать ]Ниже приведен пример хорошего исходного кода. Он освобождает память после ее выделения и использует mtrace для уведомления программиста об утечках памяти.
#include <stdlib.h>
#include <mcheck.h>
int main(void) {
mtrace(); /* Starts the recording of memory allocations and releases */
int* a = NULL;
a = malloc(sizeof(int)); /* allocate memory and assign it to the pointer */
if (a == NULL) {
return 1; /* error */
}
free(a); /* we free the memory we allocated so we don't have leaks */
muntrace();
return 0; /* exit */
}