Mtrace - Mtrace

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

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

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

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

пустота mtrace(пустота);
пустота мунтрейс(пустота);

Обработчики регистрируют все выделения памяти и освобождают их в файл, определенный переменная окружения MALLOC_TRACE (если переменная не установлена, описывает недопустимое имя файла или описывает имя файла, на которое у пользователя нет прав, обработчики не установлены).

А Perl сценарий называется mtrace, не путать с одноименной функцией, также распространяется с библиотекой GNU C; сценарий анализирует выходной файл и сообщает обо всех выделениях, которые не были освобождены.

Пример использования

Плохой исходный код

Ниже приведен пример плохого исходного кода. Проблема с программой в том, что она выделяет память, но не освобождает ее перед завершением работы.

#включают <stdlib.h>int основной(пустота) {	int * а;	а = маллок(размер(int)); / * выделяем память и назначаем ее указателю * /		вернуть 0; / * мы вышли из программы без освобождения памяти * /	/ * мы должны были освободить выделенную память с помощью оператора «free (a)» * /}

Использование MTrace

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

Смотрите также

внешняя ссылка