Макросы для отладки и создания отчетов об ошибках

Эти макросы предоставляют полезные средства отладки и трассировки.

Имя Описание
_ATL_DEBUG_INTERFACES Записывает в выходное окно любые утечки интерфейса, обнаруженные при _Module.Term вызове.
_ATL_DEBUG_QI Записывает все вызовы в QueryInterface окно вывода.
ATLASSERT Выполняет те же функции, что и макрос _ASSERTE , найденный в библиотеке времени выполнения C.
ATLENSURE Выполняет проверку параметров. При необходимости вызов AtlThrow
ATLTRACENOTIMPL Отправляет сообщение на устройство дампа, которое указанная функция не реализована.
ATLTRACE Сообщает предупреждения на выходном устройстве, например окно отладчика, в соответствии с указанными флагами и уровнями. Включен для обратной совместимости.
ATLTRACE2 Сообщает предупреждения на выходном устройстве, например окно отладчика, в соответствии с указанными флагами и уровнями.

_ATL_DEBUG_INTERFACES

Определите этот макрос перед включением всех файлов заголовков ATL для трассировки всех AddRef и Release вызовов интерфейсов компонентов в окне вывода.

#define _ATL_DEBUG_INTERFACES

Замечания

Выходные данные трассировки отображаются следующим образом:

ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug

Первая часть каждой трассировки всегда будет ATL: QIThunk. Далее — это значение, определяющее используемый интерфейс. Интерфейс thunk — это объект, используемый для поддержания счетчика ссылок и предоставления возможности трассировки, используемой здесь. Новый интерфейс создается при каждом вызове, за исключением запросов QueryInterface к IUnknown интерфейсу (в этом случае каждый раз возвращается один и тот же thunk, чтобы соответствовать правилам удостоверений COM).

Затем вы увидите AddRef или Release укажите, какой метод был вызван. После этого вы увидите значение, определяющее объект, количество ссылок на интерфейс которого было изменено. Трассировка значения — this это указатель объекта.

Счетчик ссылок, который отслеживается, — это число ссылок, указанное после AddRef или Release вызываемое значение. Обратите внимание, что это число ссылок может не соответствовать счетчику ссылок для объекта. Каждый thunk поддерживает собственный счетчик ссылок, чтобы помочь вам полностью соответствовать правилам подсчета ссылок COM.

Последняя часть информации, отслеживаемая, — это имя объекта и интерфейс, затронутый вызовом или Release вызовомAddRef.

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

ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug

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

Примечание.

_ATL_DEBUG_INTERFACES можно использовать в розничных сборках.

_ATL_DEBUG_QI

Записывает все вызовы в QueryInterface окно вывода.

#define _ATL_DEBUG_QI

Замечания

Если вызов QueryInterface завершился сбоем, в окне вывода отобразится следующее:

имя интерфейса - failed

ATLASSERT

Макрос ATLASSERT выполняет те же функции, что и макрос _ASSERTE , найденный в библиотеке времени выполнения C.

ATLASSERT(booleanExpression);

Параметры

booleanExpression
Выражение (включая указатели), результат вычисления которого отличен от нуля или равен нулю.

Замечания

В отладочных сборках ATLASSERT оценивает логическое значениеExpression и создает отчет отладки, когда результат равен false.

Требования

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

ATLENSURE

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

ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);

Параметры

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

Hr
Указывает код ошибки для возврата.

Замечания

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

Макрос вызывает ATLASSERT и если условие завершается сбоем вызовов AtlThrow.

В случае AtlThrow ATLENSURE вызывается с E_FAIL.

В ATLENSURE_THROW случае AtlThrow вызывается с указанным HRESULT.

Разница между ATLENSURE и ATLASSERT заключается в том, что ATLENSURE создает исключение в сборках выпуска, а также в сборках отладки.

Пример

void MyImportantFunction(char* psz)
{
   ATLENSURE(NULL != psz);

   char mysz[64];
   strcpy_s(mysz, sizeof(mysz), psz);
}

Требования

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

ATLTRACENOTIMPL

В отладочных сборках ATL отправляет строку " funcname не реализована" на устройство дампа и возвращает E_NOTIMPL.

ATLTRACENOTIMPL(funcname);

Параметры

funcname
[in] Строка, содержащая имя функции, которая не реализована.

Замечания

В сборках выпуска просто возвращается E_NOTIMPL.

Пример

ATLTRACENOTIMPL(_T("IOleControl::GetControlInfo"));   

Требования

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

ATLTRACE

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

ATLTRACE(exp);

ATLTRACE(
    DWORD category,
    UINT  level,
    LPCSTR lpszFormat, ...);

Параметры

exp
[in] Строка и переменные для отправки в выходное окно или любое приложение, которое перехватывает эти сообщения.

category
[in] Тип события или метода, для которого требуется сообщить. См. примечания для списка категорий.

level
[in] Уровень трассировки для отчета. Дополнительные сведения см. в примечаниях.

lpszFormat
[in] Отформатированная строка для отправки на устройство дампа.

Замечания

Описание ATLTRACE см . в ATLTRACE2 . ATLTRACE и ATLTRACE2 имеют одинаковое поведение, ATLTRACE включается для обратной совместимости.

ATLTRACE2

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

ATLTRACE2(exp);

ATLTRACE2(
    DWORD category,
    UINT level,
    LPCSTR lpszFormat,  ...);

Параметры

exp
[in] Строка для отправки в выходное окно или любое приложение, которое перехватывает эти сообщения.

category
[in] Тип события или метода, для которого требуется сообщить. См. примечания для списка категорий.

level
[in] Уровень трассировки для отчета. Дополнительные сведения см. в примечаниях.

lpszFormat
[in] printfСтрока форматирования стиля, используемая для создания строки для отправки на устройство дампа.

Замечания

Короткая форма ATLTRACE2 записывает строку в окно вывода отладчика. Вторая форма ATLTRACE2 также записывает выходные данные в выходное окно отладчика, но зависит от параметров средства трассировки ATL/MFC (см . пример ATLTraceTool). Например, если задать уровень 4 и средство трассировки ATL/MFC на уровне 0, сообщение не будет отображаться. уровень может быть 0, 1, 2, 3 или 4. Значение по умолчанию 0 сообщает только о самых серьезных проблемах.

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

Флаги трассировки ATL

Категория ATL Description
atlTraceGeneral Сообщает обо всех приложениях ATL. По умолчанию.
atlTraceCOM Отчеты о методах COM.
atlTraceQI Отчеты о вызовах QueryInterface.
atlTraceRegistrar Сообщает о регистрации объектов.
atlTraceRefcount Отчеты об изменении количества ссылок.
atlTraceWindowing Отчеты о методах Windows; Например, сообщает недопустимый идентификатор карты сообщений.
atlTraceControls Отчеты по элементам управления; например, сообщает об уничтожении элемента управления или его окна.
atlTraceHosting Отчеты, в которые размещаются сообщения; например, сообщает, когда клиент в контейнере активируется.
atlTraceDBClient Отчеты о шаблоне потребителя OLE DB; Например, при сбое вызова GetData выходные данные могут содержать HRESULT.
atlTraceDBProvider Отчеты о шаблоне поставщика OLE DB; Например, сообщает о сбое создания столбца.
atlTraceSnapin Отчеты для приложения MMC SnapIn.
atlTraceNotImpl Сообщает, что указанная функция не реализована.
atlTraceAllocation Сообщает сообщения, напечатанные средствами отладки памяти в atldbgmem.h.

Флаги трассировки MFC

Категория MFC Description
traceAppMsg Сообщения MFC общего назначения. Всегда рекомендуется.
traceDumpContext Сообщения из CDumpContext.
traceWinMsg Сообщения из кода обработки сообщений MFC.
traceMemory Сообщения из кода управления памятью MFC.
traceCmdRouting Сообщения из кода маршрутизации команд Windows в MFC.
traceHtml Поддержка сообщений из диалогового окна DHTML MFC.
traceSocket Сообщения из поддержки сокета MFC.
traceOle Сообщения из поддержки OLE MFC.
traceDatabase Сообщения из поддержки базы данных MFC.
traceInternet Сообщения из поддержки Интернета MFC.

Чтобы объявить пользовательскую категорию трассировки, объявите глобальный экземпляр CTraceCategory класса следующим образом:

CTraceCategory MY_CATEGORY(_T("MyCategoryName"), 1);

Имя категории, MY_CATEGORY в этом примере, — это имя, указанное в параметре категории . Первым параметром является имя категории, которое появится в средстве трассировки ATL/MFC. Второй параметр — это уровень трассировки по умолчанию. Этот параметр является необязательным, а уровень трассировки по умолчанию — 0.

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

ATLTRACE2(MY_CATEGORY, 2, _T("a message in a custom category"));

Чтобы указать, что необходимо отфильтровать сообщения трассировки, вставьте определения для этих макросов в Stdafx.h перед инструкцией #include <atlbase.h> .

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

Atlbase.h содержит определения по умолчанию макросов ATLTRACE2, и эти определения будут использоваться, если вы не определите эти символы перед обработкой atlbase.h.

В сборках выпуска ATLTRACE2 компилируется в (void) 0.

ATLTRACE2 ограничивает содержимое строки, отправляемой на устройство дампа, не более 1023 символов после форматирования.

ATLTRACE и ATLTRACE2 имеют одинаковое поведение, ATLTRACE включается для обратной совместимости.

Пример

int i = 1;
ATLTRACE2(atlTraceGeneral, 4, "Integer = %d\n", i);
// Output: 'Integer = 1'

См. также

Макросы
Глобальные функции для отладки и создания отчетов об ошибках