문제

MFC C ++ (Visual Studio 6)에서는 디버깅을 위해 Trace 매크로를 사용하는 데 익숙합니다. 일반 Win32에 대한 동등한 진술이 있습니까?

도움이 되었습니까?

해결책

_rptn은 편리하지는 않지만 훌륭하게 작동합니다. 여기 몇 가지 코드가 있습니다 이는 변수 수의 인수를 허용하는 함수로서 MFC 추적 문을 재현합니다. 또한 소스 파일과 줄 번호를 준비하는 TRACEEX 매크로를 추가하여 문의 위치로 다시 클릭 할 수 있습니다.

업데이트 : CodeGuru의 원본 코드는 릴리스 모드에서 나에게 컴파일하지 않으므로 릴리스 모드에 대한 추적 명령문이 제거되는 방식을 변경했습니다. 다음은 내가 추적에 넣은 전체 소스입니다. 원본에 대한 Thomas Rizos에게 감사드립니다:

// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873

#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#ifdef _DEBUG
#define TRACEMAXSTRING  1024

char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
    va_list args;
    va_start(args,format);
    int nBuf;
    nBuf = _vsnprintf(szBuffer,
                   TRACEMAXSTRING,
                   format,
                   args);
    va_end(args);

    _RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
                &strrchr(__FILE__,'\\')[1],__LINE__); \
                _RPT0(_CRT_WARN,szBuffer); \
                TRACE
#else
// Remove for release mode
#define TRACE  ((void)0)
#define TRACEF ((void)0)
#endif

#endif // __TRACE_H__850CE873

다른 팁

MSDN 문서에서 보고를위한 매크로:

Crtdbg.h에 정의 된 _rptn 및 _rptfn 매크로를 사용하여 디버깅을위한 printf 문의 사용을 대체 할 수 있습니다. _debug가 정의되지 않았을 때이 매크로는 릴리스 빌드에서 자동으로 사라지므로 #ifdefs에 포함시킬 필요가 없습니다.

OutputDebugstring도 있습니다. 그러나 릴리스를 컴파일 할 때는 제거되지 않습니다.

나는 단지 이와 같은 것을 사용합니다 (메모리에서 전혀 테스트되지 않았습니다 ...)

#define TRACE(msg) {\
    std::ostringstream ss; \
    ss << msg << "\n"; \
    OutputDebugString(msg.str()); \
}

그런 다음 다음과 같은 것을 쓸 수 있습니다.-

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);

일부 #ifdef에서 랩핑하여 릴리스 빌드에서 충분히 쉽게 빌드 할 수 있습니다.

추적 매크로 메시지를 제공합니다 소스 코드 링크, 런타임 콜 스택 정보 및 기능 프로토 타입 매개 변수 값이있는 정보 :

확장 된 흔적: Win32의 매크로 추적

나는 그것을 사용했다 _RPT() 매크로는 또한 Visual Studio 2005의 C 소스 파일과 함께 작동합니다. Visual Studio 2005/2008로 디버깅 : 로깅 및 추적 Trace, _rpt 및 기타 로깅 유형 매크로의 개요를 제공합니다.

로그가 포함 된 AssrtLog라는 로그 파일에 대한 줄을 생성하고 파일에 로그를 쓸 때 다음과 같은 소스 코드 라인도 수행합니다.

_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);

이 줄은 로그 파일에 들어가는 동일한 로그를 Visual Studio 2005 IDE의 출력 창에 넣습니다.

로깅에 사용하는 접근 방식의 역학에 관심이있을 수 있습니다. 우리는 기능이 있습니다 PifLogAbort() 로그를 생성하는 데 사용되는 일련의 인수를 받아들입니다. 이 인수에는 로그가 줄 번호와 함께 생성되는 파일의 이름이 포함됩니다. 매크로는 다음과 같습니다.

#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *)  #x , (UCHAR *)  __FILE__ , (UCHAR *) txt , __LINE__ );}

그리고 기능 프로토 타입 PifLogAbort() 이렇게 보인다 :

PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)

매크로를 사용하려면 다음과 같은 선을 삽입합니다.

NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn():  EtkTimeIn() returned error");

이 매크로가 할 일은 반환 코드가 0보다 작 으면 (어설 션이 실패) 제공된 텍스트로 로그가 생성된다는 것입니다. 로그에는 파일 이름 및 줄 번호와 함께 로그를 생성 한 조건이 포함됩니다.

함수 PifLogAbort() 지정된 길이로 로그를 생성하고 출력 파일을 원형 버퍼로 취급합니다. 로그에는 시간과 날짜 스탬프도 있습니다.

실제 오류 코드 값을 제공하기 위해 실행 시간에 동적으로 설명 텍스트를 생성하려는 경우 다음 코드 시퀀스에서와 같이 버퍼와 함께 Sprintf () 함수를 사용합니다.

if (sErrorSave != STUB_BM_DOWN) {
    char xBuff[128];
    sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
    NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}

로그를 생성하지 않으려면 매크로가 정의 된 단일 헤더 파일로 이동하여 아무것도 다시 컴파일하기 만하면됩니다. 그러나 우리는 이러한 로그가 현장 문제를 조사 할 때 매우 가치가 있으며 통합 테스트 중에 특히 유용하다는 것을 발견했습니다.

Windows 이벤트 잠재적 인 대체품입니다 TRACE 특정 시나리오에 따라 매크로. 코드는 디버그 및 릴리스 구성으로 구성됩니다. 그런 다음 이벤트 추적은 동적으로 활성화되고 비활성화되거나 실시간으로 표시되거나 나중에 진단을 위해 클라이언트의 컴퓨터에 덤프 할 수 있습니다. 흔적은 OS의 다른 부분에서 수집 된 추적 정보와 상관 관계가있을 수 있습니다.

코드가 특정 체크 포인트에 도달 할 때마다 정보를 덤프 해야하는 경우, 가변 콘텐츠, 스택 추적 또는 발신자 이름, Visual Studio 's tracepoints 그렇게 할 수없는 옵션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top