Макросы для отладки и создания отчетов об ошибках
Эти макросы предоставляют полезные средства отладки и трассировки.
Имя | Описание |
---|---|
_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
Указывает логическое выражение для тестирования.
час
Указывает код ошибки для возврата.
Замечания
Эти макросы предоставляют механизм для обнаружения и уведомления пользователя о неправильном использовании параметров.
Макрос вызывает 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'
См. также
Макросы
Глобальные функции для отладки и создания отчетов об ошибках