Назначение

Проект memcheck-2 предназначен для обнаружения утечек памяти в программах на языке C++.

Принцип работы

memcheck-2 состоит из трех компонентов:

Клиентской библиотеки memcheck.cln.
Статическая библиотека memcheck.cln содержит собственную реализацию операторов new и delete. Библиотеку memcheck.cln необходимо прилинковать к каждому исполнительному модулю проверяемого проекта. Операторы new и delete кроме управления памятью передают описание каждого выполняемого действия в memcheck.srv.
Библиотеки ведения журнала memcheck.srv.
Динамически-загружаемая библиотека memcheck.srv сохраняет информацию о каждой выполненой операции new или delete в файле memcheck.log, создаваемом в текущем каталоге.
Анализатора журнала mcloganalyzer.
Самостоятельная утилита mcloganalyzer анализирует содержимое журнала memcheck.log и выдает информацию обо всех выделеных, но не освобожденных блоках памяти.

Т.е. каждый исполняемый модуль тестируемого приложения получет новую реализацию операторов new и delete. Эта новая реализация сохраняет информацию о каждом выделении или освобождении памяти в журнальный файл memcheck.log. Для тестирования приложения необходимо осуществить запуск тестируемого модуля и получить журнал memcheck.log. После этого запускается отдельная утилита-анализатор mcloganalyzer, которая по файлу-журналу находит все не освобожденные блоки.

Информация о месте выделения блока

Статическая библиотека memcheck.cln содержит реализацию "традиционных" операторов new и delete:

void *	operator new( size_t size );
void *	operator new[]( size_t size );
void	operator delete( void * p );
void	operator delete[]( void * p );

Вызовы этих операторов в программе не несут информации о том, в какой строке какого файла был осуществлен вызов оператора. Поэтому в журнале memcheck.log вместо имени файла и номера строки будет стоять <UNKNOWN> и 0.

Для того, чтобы иметь информацию о том, в каком именно месте был вызван тот или иной оператор, в заголовочном файле memcheck_2/h/cln.hpp были опеределены макросы для операторов new и delete. В тестируемом приложении в каждом файле, использующем выделение или освобождение памяти, необходимо подключить заголовочный файл memcheck_2/h/cln.hpp. Исходный текст при этом изменять не нужно.

ВАЖНО: определение в memcheck_2/h/cln.hpp макросов с именами new и delete конфликтует с любым последующим определением операторов new и delete. Фактически, становиться невозможным определить функцию с именем new или delete. Поэтому, файл memcheck_2/h/cln.hpp должен подключаться самым последним из всех заголовочных файлов и не должен подключаться внутри заголовочных файлов.

Подключение memcheck-2 в тестируемый проект

Для подключения memcheck-2 в тестируемый проект необходимо:

  1. Поместить в тестируемый проект содержимое подпроекта memcheck_2 из состава проекта memcheck-2.
  2. Поместить содержимое файла locals_modification.4xx из проекта memcheck-2 в главный файл locals.4xx тестируемого проекта.
  3. Включить в каждый cpp-файл тестируемого проекта директиву:
    #include <memcheck_2/h/cln.hpp>
    
    Эта директива должна быть последней из всех директив #include.
  4. Для платформы UNIX добавить в locals.4xx тестируемого проекта директивы, управляющие созданием многопоточных приложений, например:
    #if defined( UNIX )
    	#if defined( FREEBSD )
    		cppOptions += "-pthread";
    		linkOptions += "-pthread";
    		defines += "_THREAD_SAFE";
    	#else
    		sysLibs += "pthread";
    	#endif
    #endif
    

Включение контроля расхода памятью

Для задействования memcheck-2 для контроля расхода памятью необходимо раскомментировать строку:

#define USE_MEMCHECK_2

в главном файле locals.4xx тестируемого приложения. Затем выполнить полную перекомпиляцию приложения.

Выключение контроля расхода памятью

Для отключения контроля расхода памятью средствами memcheck-2 необходимо закомментировать строку:

#define USE_MEMCHECK_2

в главном файле locals.4xx тестируемого приложения. Затем выполнить полную перекомпиляцию приложения.

Ограничения

Текущая версия memcheck-2 не предназначена для тестирования проектов, состоящих из нескольких одновременно работающих исполняемых модулей (exe-файлов), запускаемых из одного каталога. Объясняется это тем, что информация о каждом из модулей будет смешиваться в общем файле-журнала memcheck.log.

Утилита mcloganalyzer

Утилита mcloganalyzer не получает никаких параметров и анализирует файл memcheck.log, находящийся в текущем каталоге.

Утилита mcloganalyzer находится в подпроекте loganalyzer проекта memcheck-2. При копировании подпроекта memcheck_2 в тестируемое приложение код утилиты mcloganalyzer в тестируемое приложение не переносится и при компиляции тестируемого приложения mcloganalyzer не создается.

Переносимость memcheck-2

Текущая версия memcheck-2 была протестирована компиляторами Visual C++ 6.0, Borland C++ 5.5.1, MinGW C++ 2.0.0 на платформе Win32; компилятором GNU C++ 2.95.3 на платформе FreeBSD 4.5.

В реализации memcheck-2 виден один потенциально опасный для переносимости момент: определение макросов с именами new и delete в заголовочном файле memcheck_2/h/cln.hpp так, что в их теле используются идентификаторы new и delete.

Hosted by uCoz