디버깅 및 오류 보고 매크로
이러한 매크로는 유용한 디버깅 및 추적 기능을 제공합니다.
속성 | 설명 |
---|---|
_ATL_DEBUG_INTERFACES | 출력 창에 호출될 때 _Module.Term 감지되는 모든 인터페이스 누수에 기록합니다. |
_ATL_DEBUG_QI | 출력 창에 QueryInterface 대한 모든 호출을 씁니다. |
ATLASSERT | C 런타임 라이브러리에 있는 _ASSERTE 매크로와 동일한 기능을 수행합니다. |
ATLENSURE | 매개 변수 유효성 검사를 수행합니다. 필요한 경우 호출 AtlThrow |
ATLTRACENOTIMPL | 지정된 함수가 구현되지 않았다는 메시지를 덤프 디바이스에 보냅니다. |
ATLTRACE | 표시된 플래그 및 수준에 따라 디버거 창과 같은 출력 디바이스에 경고를 보고합니다. 이전 버전과의 호환성을 위해 포함됩니다. |
ATLTRACE2 | 표시된 플래그 및 수준에 따라 디버거 창과 같은 출력 디바이스에 경고를 보고합니다. |
_ATL_DEBUG_INTERFACES
모든 AddRef
항목을 추적할 ATL 헤더 파일을 포함하기 전에 이 매크로를 정의하고 Release
구성 요소의 인터페이스를 출력 창에 호출합니다.
#define _ATL_DEBUG_INTERFACES
설명
추적 출력은 아래와 같이 표시됩니다.
ATL: QIThunk - 2008 AddRef : Object = 0x00d81ba0 Refcount = 1 CBug - IBug
각 추적의 첫 번째 부분은 항상 .입니다 ATL: QIThunk
. 다음은 사용 중인 특정 인터페이스 펑크를 식별하는 값입니다. 인터페이스 펑크는 참조 횟수를 유지하고 여기에 사용되는 추적 기능을 제공하는 데 사용되는 개체입니다. 인터페이스에 대한 IUnknown
요청을 제외한 모든 호출 QueryInterface
에서 새 인터페이스 thunk가 생성됩니다(이 경우 COM의 ID 규칙을 준수하기 위해 매번 동일한 thunk가 반환됨).
다음으로 호출된 메서드를 확인 AddRef
하거나 Release
나타냅니다. 그런 다음 인터페이스 참조 수가 변경된 개체를 식별하는 값이 표시됩니다. 추적되는 값은 개체의 this
포인터입니다.
추적되는 참조 수는 호출된 후 AddRef
또는 Release
호출된 thunk의 참조 수입니다. 이 참조 개수는 개체의 참조 개수와 일치하지 않을 수 있습니다. 각 thunk는 COM의 참조 계산 규칙을 완전히 준수하는 데 도움이 되도록 자체 참조 수를 유지 관리합니다.
추적되는 정보의 마지막 조각은 개체의 이름과 또는 Release
호출의 영향을 AddRef
받는 인터페이스입니다.
서버가 종료 _Module.Term
되고 호출될 때 검색되는 모든 인터페이스 누수는 다음과 같이 기록됩니다.
ATL: QIThunk - 2005 LEAK : Object = 0x00d81ca0 Refcount = 1 MaxRefCount = 1 CBug - IBug
여기에 제공된 정보는 이전 추적 문에 제공된 정보에 직접 매핑되므로 인터페이스 펑크의 전체 수명 동안 참조 수를 검사할 수 있습니다. 또한 해당 인터페이스 thunk의 최대 참조 수를 표시합니다.
참고 항목
_ATL_DEBUG_INTERFACES 소매 빌드에서 사용할 수 있습니다.
_ATL_DEBUG_QI
출력 창에 QueryInterface
대한 모든 호출을 씁니다.
#define _ATL_DEBUG_QI
설명
호출 QueryInterface
에 실패하면 출력 창에 다음이 표시됩니다.
인터페이스 이름 - failed
ATLASSERT
ATLASSERT 매크로는 C 런타임 라이브러리에 있는 _ASSERTE 매크로와 동일한 기능을 수행합니다.
ATLASSERT(booleanExpression);
매개 변수
booleanExpression
0이 아닌 값 또는 0으로 계산되는 식(포인터 포함)입니다.
설명
디버그 빌드에서 ATLASSERT는 부울Expression 을 평가하고 결과가 false이면 디버그 보고서를 생성합니다.
요구 사항
헤더: atldef.h
ATLENSURE
이 매크로는 함수에 전달된 매개 변수의 유효성을 검사하는 데 사용됩니다.
ATLENSURE(booleanExpression);
ATLENSURE_THROW(booleanExpression, hr);
매개 변수
booleanExpression
테스트할 부울 식을 지정합니다.
hr
반환할 오류 코드를 지정합니다.
설명
이러한 매크로는 잘못된 매개 변수 사용을 감지하고 사용자에게 알리는 메커니즘을 제공합니다.
매크로는 ATLASSERT를 호출하고 조건이 실패하면 호출 AtlThrow
합니다.
ATLENSURE의 경우 AtlThrow
E_FAIL 사용하여 호출됩니다.
ATLENSURE_THROW 경우 AtlThrow
지정된 HRESULT를 사용하여 호출됩니다.
ATLENSURE와 ATLASSERT의 차이점은 ATLENSURE가 릴리스 빌드와 디버그 빌드에서 예외를 throw한다는 것입니다.
예시
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
덤프 디바이스로 보낼 문자열을 만드는 데 사용할 -style 형식 문자열입니다.
설명
짧은 형식의 ATLTRACE2 디버거의 출력 창에 문자열을 씁니다. 두 번째 형식의 ATLTRACE2 디버거의 출력 창에도 출력을 기록하지만 ATL/MFC 추적 도구의 설정이 적용됩니다(ATLTraceTool 샘플 참조). 예를 들어 수준을 4로 설정하고 ATL/MFC 추적 도구를 수준 0으로 설정하면 메시지가 표시되지 않습니다. 수준은 0, 1, 2, 3 또는 4일 수 있습니다. 기본값인 0은 가장 심각한 문제만 보고합니다.
범주 매개 변수는 설정할 추적 플래그를 나열합니다. 이러한 플래그는 보고하려는 메서드 유형에 해당합니다. 아래 표에는 범주 매개 변수에 사용할 수 있는 유효한 추적 플래그가 나와 있습니다.
ATL 추적 플래그
ATL 범주 | 설명 |
---|---|
atlTraceGeneral |
모든 ATL 애플리케이션에 대해 보고합니다. 기본값입니다. |
atlTraceCOM |
COM 메서드에 대한 보고서입니다. |
atlTraceQI |
QueryInterface 호출에 대한 보고서입니다. |
atlTraceRegistrar |
개체 등록에 대해 보고합니다. |
atlTraceRefcount |
참조 횟수 변경에 대한 보고서입니다. |
atlTraceWindowing |
Windows 메서드에 대한 보고서; 예를 들어 잘못된 메시지 맵 ID를 보고합니다. |
atlTraceControls |
컨트롤에 대한 보고서; 예를 들어 컨트롤 또는 해당 창이 제거되는 경우를 보고합니다. |
atlTraceHosting |
메시지 호스팅을 보고합니다. 예를 들어 컨테이너의 클라이언트가 활성화될 때 보고합니다. |
atlTraceDBClient |
OLE DB 소비자 템플릿에 대한 보고서; 예를 들어 GetData 호출에 실패하면 출력에 HRESULT가 포함될 수 있습니다. |
atlTraceDBProvider |
OLE DB 공급자 템플릿에 대한 보고서; 예를 들어 열을 만들지 못한 경우 보고합니다. |
atlTraceSnapin |
MMC SnapIn 애플리케이션에 대한 보고서입니다. |
atlTraceNotImpl |
표시된 함수가 구현되지 않았음을 보고합니다. |
atlTraceAllocation |
atldbgmem.h의 메모리 디버깅 도구에서 인쇄한 메시지를 보고합니다. |
MFC 추적 플래그
MFC 범주 | 설명 |
---|---|
traceAppMsg |
범용, MFC 메시지. 항상 권장합니다. |
traceDumpContext |
CDumpContext의 메시지입니다. |
traceWinMsg |
MFC의 메시지 처리 코드에서 보낸 메시지입니다. |
traceMemory |
MFC의 메모리 관리 코드에서 보낸 메시지입니다. |
traceCmdRouting |
MFC의 Windows 명령 라우팅 코드에서 보낸 메시지입니다. |
traceHtml |
MFC의 DHTML 대화 상자 지원 메시지입니다. |
traceSocket |
MFC 소켓 지원의 메시지입니다. |
traceOle |
MFC의 OLE 지원 메시지입니다. |
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'