Поделиться через


Диагностические службы

Библиотека Microsoft Foundation Class предоставляет множество служб диагностики, которые упрощают отладку программ. Эти службы включают в себя макросы и глобальные функции, позволяющие отслеживать выделение памяти для программы, записывать дамп содержимого объектов во время выполнения и печатать сообщения отладки во время выполнения. Макросы и глобальные функции диагностических служб сгруппированы в следующие категории:

  • общие диагностические макросы;

  • общие диагностические функции и переменные;

  • функции диагностики объектов.

Эти макросы и функции доступны для всех классов, производных от CObject , в отладочной и окончательной версиях MFC. Однако все, кроме DEBUG_NEW и VERIFY, ничего не делают в версии выпуска.

В библиотеке отладки все выделенные блоки памяти заключены в скобки с рядом "байтов охранников". Если эти байты нарушаются записью в памяти, то диагностические процедуры могут сообщить о проблеме. Если включить строку:

#define new DEBUG_NEW

в файле реализации все вызовы new будут хранить имя файла и номер строки, в которых произошло выделение памяти. Функция CMemoryState::DumpAllObjectsSince будет выводить дополнительную информацию, позволяющую выявить утечки памяти. Дополнительные сведения о выходных диагностических данных см. также в описании класса CDumpContext .

Кроме того, библиотека времени выполнения C также поддерживает ряд диагностических функций, которые можно использовать для отладки приложений. Дополнительные сведения см. в разделе Подпрограммы отладки справочника по библиотеке времени выполнения.

Общие диагностические макросы MFC

Имя Описание
ASSERT Выводит сообщение и прерывает выполнение программы, если указанное выражение равно FALSE в отладочной версии библиотеки.
ASSERT_KINDOF Проверяет, является ли объект объектом указанного класса или класса, производного от указанного.
ASSERT_VALID Проверяет внутреннюю допустимость объекта, вызывая его функцию-член AssertValid ; обычно переопределяется из CObject.
DEBUG_NEW Предоставляет имя файла и номер строки для каждого выделения объекта в режиме отладки для выявления утечек памяти.
DEBUG_ONLY Аналогично ASSERT , но не проверяет значение выражения; полезно для кода, который должен выполняться только в режиме отладки.
ОБЕСПЕЧЕНИЕ И ENSURE_VALID Используется для проверки правильности данных.
THIS_FILE Расширяет имя скомпилированного файла.
TRACE Работает аналогично printfв отладочной версии библиотеки.
VERIFY Аналогично ASSERT , но вычисляет выражение в окончательной версии библиотеки, а также в отладочной версии.

Общие диагностические переменные и функции MFC

Имя Описание
afxDump Глобальная переменная, которая отправляет информацию CDumpContext в окно выходных данных отладчика или в терминал отладки.
afxMemDF Глобальная переменная, которая управляет поведением отладочного распределителя памяти.
AfxCheckError Глобальная переменная, используемая для проверки переданного значения SCODE на предмет того, представляет ли оно ошибку; если да, вызывается соответствующая ошибка.
AfxCheckMemory Проверяет целостность всей выделенной на текущий момент памяти.
Функция AfxDebugBreak Вызывает разрыв в выполнении.
AfxDump При вызове в отладчике записывает дамп состояния объекта в процессе отладки.
AfxDump Внутренняя функция, которая сбрасывает состояние объекта во время отладки.
AfxDumpStack Создает образ текущего стека. Эта функция всегда компонуется статически.
AfxEnableMemoryLeakDump Включает дамп утечки памяти.
AfxEnableMemoryTracking Включает и отключает отслеживание памяти.
AfxIsMemoryBlock Проверяет, правильно ли выделен блок памяти.
AfxIsValidAddress Проверяет, находится ли диапазон адресов памяти в рамках области памяти программы.
AfxIsValidString Определяет, является ли указатель на строку допустимым.
AfxSetAllocHook Обеспечивает вызов функции для каждого выделения памяти.

Функции диагностики объектов MFC

Имя Описание
AfxDoForAllClasses Выполняет указанную функцию для всех производных от CObjectклассов, которые поддерживают проверку типов во время выполнения.
AfxDoForAllObjects Выполняет указанную функцию для всех CObjectпроизводных объектов, выделенных с new.

Макросы компиляции MFC

Имя Описание
_AFX_SECURE_NO_WARNINGS Подавляет предупреждения компилятора для использования устаревших функций MFC.

_AFX_SECURE_NO_WARNINGS

Подавляет предупреждения компилятора для использования устаревших функций MFC.

Синтаксис

_AFX_SECURE_NO_WARNINGS

Пример

Этот пример кода вызывает предупреждение компилятора, если _AFX_SECURE_NO_WARNINGS оно не определено.

// define this before including any afx files in *pch.h* (*stdafx.h* in Visual Studio 2017 and earlier)
#define _AFX_SECURE_NO_WARNINGS

// . . .

CRichEditCtrl* pRichEdit = new CRichEditCtrl;
pRichEdit->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_MULTILINE,
   CRect(10,10,100,200), pParentWnd, 1);
char sz[256];
pRichEdit->GetSelText(sz);

Функция AfxDebugBreak

Вызовите эту функцию, чтобы вызвать разрыв (в расположении вызова AfxDebugBreak) в выполнении отладочной версии приложения MFC.

Синтаксис

void AfxDebugBreak( );

Замечания

AfxDebugBreak не действует в версиях выпуска приложения MFC и его следует удалить. Эта функция должна использоваться только в приложениях MFC. Используйте версию API Win32, DebugBreakчтобы вызвать разрыв в приложениях, отличных от MFC.

Требования

Заголовок: afxver_.h

ASSERT

Вычисляет его аргумент.

ASSERT(booleanExpression)

Параметры

booleanExpression
Указывает выражение (включая значения указателя), которое оценивается как ненулевое или 0.

Замечания

Если результат равен 0, макрос выводит диагностическое сообщение и прерывает программу. Если условие ненулевое, это ничего не делает.

Диагностическое сообщение имеет форму

assertion failed in file <name> in line <num>

где имя — это имя исходного файла, а число — номер строки утверждения, завершившемся сбоем в исходном файле.

В версии выпуска MFC утверждение не вычисляет выражение и поэтому не прерывает программу. Если выражение должно оцениваться независимо от среды, используйте макрос VERIFY вместо ASSERT.

Примечание.

Эта функция доступна только в версии отладки MFC.

Пример

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(pcage != NULL);
ASSERT(pcage->IsKindOf(RUNTIME_CLASS(CAge)));
// Terminates program only if pcage is NOT a CAge*.   

Требования

Заголовок: afx.h

ASSERT_KINDOF

Этот макрос утверждает, что объект, на который указывает объект указанного класса, или является объектом класса, производным от указанного класса.

ASSERT_KINDOF(classname, pobject)

Параметры

classname
Имя производного CObjectкласса.

pobject
Указатель на объект класса.

Замечания

Параметр pobject должен быть указателем на объект и может быть const. Объект, на который указывает и класс, должен поддерживать CObject сведения о классе времени выполнения. Например, чтобы убедиться, что pDocument это указатель на объект CMyDoc класса или любой из его производных, можно закодировать:

ASSERT_KINDOF(CMyDoc, pDocument);

ASSERT_KINDOF Использование макроса точно так же, как кодирование:

ASSERT(pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));

Эта функция работает только для классов, объявленных с помощью макроса [DECLARE_DYNAMIC](run-time-object-model-services.md#declare_dynamic или макроса DECLARE_SERIAL .

Примечание.

Эта функция доступна только в версии отладки MFC.

Требования

Заголовок: afx.h

ASSERT_VALID

Используйте для проверки предположений о действительности внутреннего состояния объекта.

ASSERT_VALID(pObject)

Параметры

pObject
Указывает объект класса, производный от CObject этого, имеет переопределяющую версию AssertValid функции-члена.

Замечания

ASSERT_VALID вызывает AssertValid функцию-член объекта, переданную в качестве аргумента.

В версии выпуска MFC ASSERT_VALID ничего не делает. В отладочной версии он проверяет указатель, проверяет значение NULL и вызывает собственные AssertValid функции-члены объекта. Если любой из этих тестов завершается сбоем, сообщение генерации оповещений отображается таким же образом, как и ASSERT.

Примечание.

Эта функция доступна только в версии отладки MFC.

Дополнительные сведения и примеры см. в разделе "Отладка приложений MFC".

Пример

// Assure that pMyObject is a valid pointer to an
// object derived from CObject.
ASSERT_VALID(pMyObject);

Требования

Заголовок: afx.h

DEBUG_NEW

Помогает найти утечки памяти.

#define  new DEBUG_NEW

Замечания

Вы можете использовать DEBUG_NEW везде в программе, которые обычно используются оператором new для выделения хранилища кучи.

В режиме отладки (если определен символ _DEBUG ), DEBUG_NEW отслеживает имя файла и номер строки для каждого объекта, который он выделяет. Затем при использовании функции-члена CMemoryState::D umpAllObjectsSince каждый объект, выделенный с DEBUG_NEW, отображается с именем файла и номером строки, где он был выделен.

Чтобы использовать DEBUG_NEW, вставьте следующую директиву в исходные файлы:

#define new DEBUG_NEW

После вставки этой директивы препроцессор будет вставлять DEBUG_NEW везде, где вы используете new, и MFC выполняет остальные действия. При компиляции версии выпуска программы DEBUG_NEW разрешается в простую new операцию, а имя файла и номер строки не создаются.

Примечание.

В предыдущих версиях MFC (4.1 и более ранних версий) необходимо поместить инструкцию #define после всех инструкций, которые вызвали макросы IMPLEMENT_DYNCREATE или IMPLEMENT_SERIAL. Это больше не требуется.

Требования

Заголовок: afx.h

DEBUG_ONLY

В режиме отладки (при определении символа _DEBUG ) DEBUG_ONLY оценивает его аргумент.

DEBUG_ONLY(expression)

Замечания

В сборке выпуска DEBUG_ONLY не оценивает его аргумент. Это полезно при наличии кода, который должен выполняться только в отладочных сборках.

Макрос DEBUG_ONLY эквивалентен окружающему выражению и #ifdef _DEBUG #endif.

Пример

void ExampleFunc(char* p, int size, char fill)
{
   char* q;               // working copy of pointer 
   VERIFY(q = p);         // copy buffer pointer and validate
   ASSERT(size >= 100);   // make sure buffer is at least 100 bytes
   ASSERT(isalpha(fill)); // make sure fill character is alphabetic
   // if fill character is invalid, substitute 'X' so we can continue
   // debugging after the preceding ASSERT fails.
   DEBUG_ONLY(fill = (isalpha(fill)) ? fill : 'X');
}

Требования

Заголовок: afx.h

ОБЕСПЕЧЕНИЕ И ENSURE_VALID

Используется для проверки правильности данных.

Синтаксис

ENSURE(  booleanExpression )
ENSURE_VALID( booleanExpression  )

Параметры

booleanExpression
Указывает логическое выражение для тестирования.

Замечания

Цель этих макросов — улучшить проверку параметров. Макросы предотвращают дальнейшую обработку неправильных параметров в коде. В отличие от макросов ASSERT, макросы ENSURE создают исключение в дополнение к созданию утверждения.

Макросы ведут себя двумя способами в соответствии с конфигурацией проекта. Макросы вызывают ASSERT, а затем вызывают исключение, если утверждение завершается ошибкой. Таким образом, в конфигурациях отладки (т. е. при определении _DEBUG) макросы создают утверждение и исключение в конфигурациях выпуска, макросы создают только исключение (ASSERT не оценивает выражение в конфигурациях выпуска).

Макрос ENSURE_ARG действует как макрос ENSURE.

ENSURE_VALID вызывает макрос ASSERT_VALID (который действует только в сборках отладки). Кроме того, ENSURE_VALID создает исключение, если указатель имеет значение NULL. Тест NULL выполняется в конфигурациях отладки и выпуска.

Если любой из этих тестов завершается сбоем, сообщение генерации оповещений отображается таким же образом, как и ASSERT. При необходимости макрос создает недопустимое исключение аргумента.

Требования

Заголовок: afx.h

THIS_FILE

Расширяет имя скомпилированного файла.

Синтаксис

THIS_FILE

Замечания

Сведения используются макросами ASSERT и VERIFY. Мастер приложений и мастера кода помещают макрос в создаваемые файлы исходного кода.

Пример

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// __FILE__ is one of the six predefined ANSI C macros that the
// compiler recognizes.

Требования

Заголовок: afx.h

ТРАССИРОВКА

Отправляет указанную строку отладчику текущего приложения.

TRACE(exp)
TRACE(DWORD  category,  UINT  level, LPCSTR lpszFormat, ...)

Замечания

Описание TRACE см . в ATLTRACE2 . TRACE и ATLTRACE2 имеют одинаковое поведение.

В отладочной версии MFC этот макрос отправляет указанную строку отладчику текущего приложения. В сборке выпуска этот макрос компилируется ничего (код не создается вообще).

Дополнительные сведения см. в разделе "Отладка приложений MFC".

Требования

Заголовок: afx.h

VERIFY

В отладочной версии MFC вычисляет его аргумент.

VERIFY(booleanExpression)

Параметры

booleanExpression
Указывает выражение (включая значения указателя), которое оценивается как ненулевое или 0.

Замечания

Если результат равен 0, макрос выводит диагностическое сообщение и останавливает программу. Если условие ненулевое, это ничего не делает.

Диагностическое сообщение имеет форму

assertion failed in file <name> in line <num>

Где имя является именем исходного файла и числом является номер строки утверждения, завершившемся сбоем в исходном файле.

В версии выпуска MFC ПРОВЕРКА вычисляет выражение, но не печатает или не прерывает программу. Например, если выражение является вызовом функции, вызов будет выполнен.

Пример

// VERIFY can be used for things that should never fail, though
// you may want to make sure you can provide better error recovery
// if the error can actually cause a crash in a production system.

// It _is_ possible that GetDC() may fail, but the out-of-memory
// condition that causes it isn't likely. For a test application,
// this use of VERIFY() is fine. For any production code, this
// usage is dubious.

// get the display device context
HDC hdc;
VERIFY((hdc = ::GetDC(hwnd)) != NULL);

// give the display context back
::ReleaseDC(hwnd, hdc);

Требования

Заголовок: afx.h

afxDump (CDumpContext в MFC)

Предоставляет базовые возможности дампа объектов в приложении.

CDumpContext  afxDump;

Замечания

afxDump — это предопределенный объект CDumpContext , позволяющий отправлять CDumpContext сведения в окно вывода отладчика или в терминал отладки. Как правило, в качестве параметра предоставляется afxDump CObject::Dumpпараметр.

В Windows NT и во всех версиях Windows afxDump выходные данные отправляются в окно выходной отладки Visual C++ при отладке приложения.

Эта переменная определена только в версии отладки MFC. Дополнительные сведения см. в afxDumpразделе "Отладка приложений MFC".

Пример

// example for afxDump
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//..
// now dump the contents
#ifdef _DEBUG
afxDump << _T("Dumping myPerson:\n");
pMyPerson->Dump(afxDump);
afxDump << _T("\n");
#endif

Требования

Заголовок: afx.h

AfxDump (Internal)

Внутренняя функция, которую MFC использует для дампа состояния объекта во время отладки.

Синтаксис

void AfxDump(const CObject* pOb);

Параметры

Тн
Указатель на объект класса, производный от CObject.

Замечания

AfxDump вызывает функцию-член объекта Dump и отправляет сведения в расположение, указанное переменной afxDump . AfxDump доступен только в версии отладки MFC.

Код программы не должен вызываться AfxDump, но вместо этого следует вызывать Dump функцию-член соответствующего объекта.

Требования

Заголовок: afx.h

afxMemDF

Эта переменная доступна отладчику или программе и позволяет настроить выделение диагностика.

int  afxMemDF;

Замечания

afxMemDF может иметь следующие значения, указанные в перечислении afxMemDF:

  • allocMemDF Включает отладочный распределитель (параметр по умолчанию в библиотеке отладки).

  • delayFreeMemDF Задержка освобождения памяти. Хотя программа освобождает блок памяти, распределитель не возвращает память базовой операционной системе. Это приведет к максимальному нагрузке на память в вашей программе.

  • checkAlwaysMemDF Вызовы AfxCheckMemory при каждом выделении или освобождении памяти. Это значительно замедлит выделение памяти и распределение сделки.

Пример

afxMemDF = allocMemDF | checkAlwaysMemDF;

Требования

Заголовок: afx.h

AfxCheckError

Эта функция проверяет переданный SCODE, чтобы узнать, является ли это ошибкой.

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryException*
throw COleException*

Замечания

Если это ошибка, функция создает исключение. Если переданный SCODE E_OUTOFMEMORY, функция создает исключение CMemoryException путем вызова AfxThrowMemoryException. В противном случае функция вызывает COleException путем вызова AfxThrowOleException.

Эту функцию можно использовать для проверки возвращаемых значений вызовов функций OLE в приложении. Проверив возвращаемое значение с помощью этой функции в приложении, вы можете правильно реагировать на условия ошибки с минимальным количеством кода.

Примечание.

Эта функция имеет тот же эффект в отладке и сборках, отличных от отладки.

Пример

AfxCheckError(::CoCreateInstance(clsidWMP, NULL, CLSCTX_INPROC_SERVER,
   IID_IDispatch, (LPVOID*)& pWMPDispatch));

oddWMP.AttachDispatch(pWMPDispatch, TRUE);

Требования

Заголовок: afx.h

AfxCheckMemory

Эта функция проверяет пул свободной памяти и выводит сообщения об ошибках по мере необходимости.

BOOL  AfxCheckMemory();

Возвращаемое значение

Ненулевое значение, если нет ошибок памяти; в противном случае — 0.

Замечания

Если функция не обнаруживает повреждения памяти, она ничего не выводит.

Все блоки памяти, выделенные new в кучи, проверяются, включая выделенные, но не выделенные прямыми вызовами базовых распределителей памяти, например функцию malloc или GlobalAlloc функцию Windows. Если какой-либо блок поврежден, сообщение выводится в выходные данные отладчика.

Если включить строку

#define new DEBUG_NEW

в модуле программы последующие вызовы отображают AfxCheckMemory имя файла и номер строки, в котором выделена память.

Примечание.

Если модуль содержит одну или несколько реализаций сериализуемых классов, необходимо поместить #define строку после последнего вызова макроса IMPLEMENT_SERIAL.

Эта функция работает только в отладочной версии MFC.

Пример

CAge* pcage = new CAge(21);  // CAge is derived from CObject.
Age* page = new Age(22);     // Age is NOT derived from CObject.
*(((char*)pcage) - 1) = 99;   // Corrupt preceding guard byte
*(((char*)page) - 1) = 99;    // Corrupt preceding guard byte
AfxCheckMemory();

Требования

Заголовок: afx.h

AfxDump (MFC)

Вызовите эту функцию во время отладчика для дампа состояния объекта во время отладки.

void AfxDump(const CObject* pOb);

Параметры

Тн
Указатель на объект класса, производный от CObject.

Замечания

AfxDump вызывает функцию-член объекта Dump и отправляет сведения в расположение, указанное переменной afxDump . AfxDump доступен только в версии отладки MFC.

Код программы не должен вызываться AfxDump, но вместо этого следует вызывать Dump функцию-член соответствующего объекта.

Требования

Заголовок: afx.h

AfxDumpStack

Эту глобальную функцию можно использовать для создания образа текущего стека.

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

Параметры

dwTarget
Указывает целевой объект выходных данных дампа. Возможные значения, которые можно объединить с помощью побитового оператора OR (|) следующим образом:

  • AFX_STACK_DUMP_TARGET_TRACE отправляет выходные данные с помощью макроса TRACE . Макрос TRACE создает выходные данные только в отладочных сборках; он не создает выходных данных в сборках выпуска. Кроме того, трассировка может быть перенаправлена на другие целевые объекты, кроме отладчика.

  • AFX_STACK_DUMP_TARGET_DEFAULT отправляет выходные данные дампа в целевой объект по умолчанию. Для отладочной сборки выходные данные переходит к макросу TRACE. В сборке выпуска выходные данные переходит в буфер обмена.

  • AFX_STACK_DUMP_TARGET_CLIPBOARD отправляет выходные данные только в буфер обмена. Данные помещаются в буфер обмена в виде обычного текста с помощью формата буфера обмена CF_TEXT.

  • AFX_STACK_DUMP_TARGET_BOTH одновременно отправляет выходные данные в буфер обмена и в макрос TRACE.

  • AFX_STACK_DUMP_TARGET_ODS отправляет выходные данные непосредственно в отладчик с помощью функции OutputDebugString()Win32. Этот параметр создаст выходные данные отладчика как в сборках отладки, так и в выпусках при присоединении отладчика к процессу. AFX_STACK_DUMP_TARGET_ODS всегда достигает отладчика (если он подключен) и не может быть перенаправлен.

Замечания

В приведенном ниже примере показана одна строка выходных данных, созданных при вызове AfxDumpStack обработчика кнопки в приложении диалогового окна MFC:

=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct
AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===

Каждая строка в выходных данных выше указывает адрес последнего вызова функции, полное имя модуля, содержащего вызов функции, и прототип функции. Если вызов функции в стеке не выполняется в точном адресе функции, отображается смещение байтов.

Например, в следующей таблице описывается первая строка приведенных выше выходных данных:

Выходные данные Description
00427D55: Возвращаемый адрес последнего вызова функции.
DUMP2\DEBUG\DUMP2.EXE! Полное имя пути модуля, содержащего вызов функции.
void AfxDumpStack(unsigned long) Вызывается прототип функции.
+ 181 bytes Смещение в байтах от адреса прототипа функции (в данном случае void AfxDumpStack(unsigned long)) до возвращаемого адреса (в данном случае 00427D55).

AfxDumpStack доступен в отладочных и недебочных версиях библиотек MFC; однако функция всегда связана статически, даже если исполняемый файл использует MFC в общей библиотеке DLL. В реализации общей библиотеки функция находится в MFCS42. Библиотека LIB (и ее варианты).

Чтобы использовать эту функцию успешно, выполните указанные ниже действия.

  • Файл IMAGEHLP.DLL должен находиться в пути. Если у вас нет этой библиотеки DLL, функция отобразит сообщение об ошибке. Дополнительные сведения о наборе функций, предоставленном IMAGEHLP, см . в библиотеке справки по изображениям.

  • Модули, имеющие кадры в стеке, должны содержать сведения об отладке. Если они не содержат сведения об отладке, функция по-прежнему создаст трассировку стека, но трассировка будет менее подробной.

Требования

Заголовок: afx.h

AfxEnableMemoryLeakDump

Включает и отключает дамп утечки памяти в деструкторе AFX_DEBUG_STATE.

BOOL AFXAPI AfxEnableMemoryLeakDump(BOOL bDump);

Параметры

bDump
[in] ЗНАЧЕНИЕ TRUE указывает, что дамп утечки памяти включен; FALSE указывает, что дамп утечки памяти отключен.

Возвращаемое значение

Предыдущее значение для этого флага.

Замечания

Когда приложение выгружает библиотеку MFC, она выполняет проверку на наличие утечек памяти. На этом этапе все утечки памяти передаются пользователю через окно отладки Visual Studio.

Если приложение загружает другую библиотеку перед библиотекой MFC, некоторые выделения памяти в этой библиотеке ошибочно выводятся как утечки памяти. Ложные утечки памяти могут привести к медленному закрытию приложения, пока библиотека MFC сообщает о них. В этом случае воспользуйтесь AfxEnableMemoryLeakDump , чтобы отключить дамп утечки памяти.

Примечание.

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

Требования

Заголовок: afx.h

AfxEnableMemoryTracking

Отслеживание памяти диагностики обычно включено в отладочной версии MFC.

BOOL AfxEnableMemoryTracking(BOOL bTrack);

Параметры

bTrack
При задании этого значения значение TRUE включает отслеживание памяти; ЗНАЧЕНИЕ FALSE отключает его.

Возвращаемое значение

Предыдущий параметр флага отслеживания.

Замечания

Эта функция позволяет отключить отслеживание в разделах кода, которые вы знаете, правильно распределить блоки.

Дополнительные сведения см. в AfxEnableMemoryTrackingразделе "Отладка приложений MFC".

Примечание.

Эта функция работает только в отладочной версии MFC.

Пример

BOOL CMyWinApp::InitInstance()
{
#ifdef _DEBUG
   // Disable tracking of memory for the scope of the InitInstance()
   AfxEnableMemoryTracking(FALSE);
#endif  // _DEBUG

   // ...

#ifdef _DEBUG
   // Re-enable tracking of memory
   AfxEnableMemoryTracking(TRUE);
#endif  // _DEBUG

   return TRUE;
}

Требования

Заголовок: afx.h

AfxIsMemoryBlock

Проверяет адрес памяти, чтобы убедиться, что он представляет активный блок памяти, выделенный версией диагностики new.

BOOL AfxIsMemoryBlock(
    const void* p,
    UINT nBytes,
    LONG* plRequestNumber = NULL);

Параметры

p
Указывает на блок памяти для тестирования.

nBytes
Содержит длину блока памяти в байтах.

plRequestNumber
Указывает на long целое число, которое будет заполнено порядковым номером блока памяти или нулем, если он не представляет активного блока памяти.

Возвращаемое значение

Ненулевое значение, если блок памяти выделен в данный момент и длина правильной; в противном случае — 0.

Замечания

Он также проверяет указанный размер по исходному выделенному размеру. Если функция возвращает ненулевое значение, номер последовательности выделения возвращается в plRequestNumber. Это число представляет порядок выделения блока относительно всех остальных new выделений.

Пример

CAge* pcage = new CAge(21); // CAge is derived from CObject.
ASSERT(AfxIsMemoryBlock(pcage, sizeof(CAge)));

Требования

Заголовок: afx.h

AfxIsValidAddress

Проверяет любой адрес памяти, чтобы убедиться, что он содержится полностью в пространстве памяти программы.

BOOL AfxIsValidAddress(
    const void* lp,
    UINT nBytes,
    BOOL bReadWrite = TRUE);

Параметры

lp
Указывает на тестируемый адрес памяти.

nBytes
Содержит количество байтов памяти для тестирования.

bReadWrite
Указывает, является ли память как для чтения, так и записи (TRUE) или просто для чтения (FALSE).

Возвращаемое значение

В отладочных сборках ненулевое значение, если указанный блок памяти содержится полностью в пространстве памяти программы; в противном случае — 0.

В сборках, отличных от отладки, ненулевое значение, если значение lp не равно NULL; в противном случае — значение 0.

Замечания

Адрес не ограничен блоками, выделенными new.

Пример

// Allocate a 5 character array, which should have a valid memory address.
char* arr = new char[5];

// Create a null pointer, which should be an invalid memory address.
char* null = (char*)0x0;

ASSERT(AfxIsValidAddress(arr, 5));
ASSERT(!AfxIsValidAddress(null, 5));

Требования

Заголовок: afx.h

AfxIsValidString

Используйте эту функцию для определения допустимости указателя на строку.

BOOL  AfxIsValidString(
    LPCSTR lpsz,
    int nLength = -1);

Параметры

lpsz
Указатель для тестирования.

nLength
Указывает длину проверяемой строки в байтах. Значение -1 указывает на то, что строка будет завершена со значением NULL.

Возвращаемое значение

В отладочных сборках ненулевое значение, если указанный указатель указывает на строку указанного размера; в противном случае — 0.

В сборках, отличных от отладки, ненулевое значение, если lpsz не равно NULL; в противном случае — значение 0.

Пример

// Create a character string which should be valid.
char str[12] = "hello world";

// Create a null pointer, which should be an invalid string.
char* null = (char*)0x0;

ASSERT(AfxIsValidString(str, 12));
ASSERT(!AfxIsValidString(null, 5));

Требования

Заголовок: afx.h

AfxSetAllocHook

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

AFX_ALLOC_HOOK AfxSetAllocHook(AFX_ALLOC_HOOK pfnAllocHook);

Параметры

pfnAllocHook
Указывает имя вызываемой функции. См. примечания для прототипа функции выделения.

Возвращаемое значение

Ненулевое значение, если вы хотите разрешить выделение; в противном случае — 0.

Замечания

Средство отладки и памяти библиотеки классов Microsoft Foundation может вызывать определяемую пользователем функцию перехватчика, чтобы разрешить пользователю отслеживать выделение памяти и контролировать, разрешено ли выделение. Функции перехватчика выделения прототипируются следующим образом:

BOOL AFXAPI AllocHook( size_tnSize, BOOLbObject, LONG ); lRequestNumber

nSize
Размер предлагаемого выделения памяти.

bObject
ЗНАЧЕНИЕ TRUE, если выделение предназначено для производного CObjectобъекта; в противном случае — ЗНАЧЕНИЕ FALSE.

lRequestNumber
Порядковый номер выделения памяти.

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

Требования

Заголовок: afx.h

AfxDoForAllClasses

Вызывает указанную функцию итерации для всех сериализуемых CObjectпроизводных классов в пространстве памяти приложения.

void
AFXAPI AfxDoForAllClasses(
    void (* pfn)(const CRuntimeClass* pClass, void* pContext),
    void* pContext);

Параметры

pfn
Указывает на функцию итерации, вызываемую для каждого класса. Аргументы функции — это указатель на объект и указатель void на CRuntimeClass дополнительные данные, которые вызывающий предоставляет функции.

pContext
Указывает на необязательные данные, которые вызывающий объект может предоставить функции итерации. Этот указатель может иметь значение NULL.

Замечания

Производные CObjectот сериализации классы являются классами, производными с помощью макроса DECLARE_SERIAL. Указатель, передаваемый AfxDoForAllClasses в pContext , передается в указанную функцию итерации при каждом вызове.

Примечание.

Эта функция работает только в отладочной версии MFC.

Пример

#ifdef _DEBUG
void DoForAllClasses(const CRuntimeClass* pClass, void* pContext)
{
   ASSERT(pContext != NULL);
   CString* pStr = (CString*)pContext;

   *pStr += pClass->m_lpszClassName;
   *pStr += _T("\n");
}
#endif

 

#ifdef _DEBUG
CString cStr;
AfxDoForAllClasses(DoForAllClasses, &cStr);
AfxMessageBox(cStr);
#endif

Требования

Заголовок: afx.h

AfxDoForAllObjects

Выполняет указанную функцию итерации для всех объектов, производных от CObject выделенных new.

void AfxDoForAllObjects(
    void (* pfn)(CObject* pObject, void* pContext),
    void* pContext);

Параметры

pfn
Указывает на функцию итерации, выполняемую для каждого объекта. Аргументы функции — это указатель на CObject указатель на пустоту и дополнительные данные, которые вызывающий предоставляет функции.

pContext
Указывает на необязательные данные, которые вызывающий объект может предоставить функции итерации. Этот указатель может иметь значение NULL.

Замечания

Стек, глобальные или внедренные объекты не перечисляются. Указатель, передаваемый AfxDoForAllObjects в pContext , передается в указанную функцию итерации при каждом вызове.

Примечание.

Эта функция работает только в отладочной версии MFC.

Пример

#ifdef _DEBUG
void DoForAllObjects(CObject* pObject, void* pContext)
{
   int* pnCount = (int*)pContext;

   pObject->AssertValid();
   if (pnCount != NULL)
      (*pnCount)++;
}
#endif // _DEBUG

 

#ifdef _DEBUG
//AfxDoForAllObjects will call the function DoForAllObjects 
//For each CObject-derived object that is allocated on the heap
int nCount = 0;
AfxDoForAllObjects(DoForAllObjects, &nCount);
TRACE("%d Objects Checked\n", nCount);
#endif

См. также

Макросы и глобальные
CObject::D ump