Проект memcheck-2 предназначен для обнаружения утечек памяти в программах на языке C++.
memcheck-2 состоит из трех компонентов:
Т.е. каждый исполняемый модуль тестируемого приложения получет новую реализацию операторов 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 в тестируемый проект необходимо:
#include <memcheck_2/h/cln.hpp>Эта директива должна быть последней из всех директив #include.
#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 не получает никаких параметров и анализирует файл memcheck.log, находящийся в текущем каталоге.
Утилита mcloganalyzer находится в подпроекте loganalyzer проекта memcheck-2. При копировании подпроекта memcheck_2 в тестируемое приложение код утилиты mcloganalyzer в тестируемое приложение не переносится и при компиляции тестируемого приложения mcloganalyzer не создается.
Текущая версия 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.