Jump to content

mtrace

mtrace отладчик памяти, включенный в библиотеку GNU C.

Использовать

[ редактировать ]

Обратите внимание, что mtrace инструмент работает только с однопоточными приложениями. Один поток может временно удалить перехватчик, в то время как другой поток может одновременно выделить память, что приведет к пропущенному выделению памяти в многопоточном приложении!

Функция mtrace устанавливает обработчики для malloc, realloc и free; функция muntrace отключает эти обработчики. Их прототипы , определенные в заголовочном файле mcheck.h, являются

void mtrace(void);
void muntrace(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

[ редактировать ]
  1. Установите переменную среды MALLOC_TRACE к пути к желаемому выходному файлу. Установка переменных среды немного отличается в каждой оболочке. В Bourne Shell оболочках, совместимых с , таких как Bash , команда выглядит следующим образом:
    $ MALLOC_TRACE=/home/YourUserName/path/to/program/MallocTraceOutputFile.txt
    $ export MALLOC_TRACE
    
  2. Включать mcheck.h в исходном коде. Это можно сделать, например, добавив следующую строку в начало файла C или C++ , как показано ниже:
    #include <mcheck.h>
    
  3. Вызов функции mtrace() прежде чем начать выделять память. Обычно проще позвонить mtrace() в самом начале main() функция:
    mtrace();
    
    Чтобы обозначить конец кода, который необходимо отследить, вызовите функцию muntrace(). Обычно это делается в конце main() функция:
    muntrace();
    
  4. Скомпилируйте и запустите программу как обычно. Обратите внимание, что вам необходимо скомпилировать с помощью -g возможность получить полезный результат. В GCC в Linux это можно сделать с помощью следующих команд для программы C :
    $ gcc yourProgram.c -g
    $ ./a.out
    
  5. Информация об утечке памяти будет сообщена в файле, указанном MALLOC_TRACE переменная среды. Сложность в том, что этот файл будет в формате, читаемом компьютером. Большинство машин Linux поставляются с консольной командой под названием mtrace, который преобразует формат, читаемый компьютером, в текст, читаемый человеком, как показано ниже. Если у вас нет доступа к этой консольной команде, существует Perl одноименный сценарий , который можно загрузить для выполнения той же задачи. mtrace синтаксис следующий:
    $ mtrace <exec_file_name> <malloc_trace_filename>
    
    Например:
    $ mtrace a.out MallocTraceOutputFile.txt
    
  6. 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 */
}

См. также

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 728b06678848c4a21798dec91438b2c9__1699261920
URL1:https://arc.ask3.ru/arc/aa/72/c9/728b06678848c4a21798dec91438b2c9.html
Заголовок, (Title) документа по адресу, URL1:
mtrace - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)