본문 바로가기

개발관련/MFC

TRACE for Debug ( in MFC )

사용자 삽입 이미지

 TRACE 매크로는 실제로 AfxTrace 함수로 연결되어 있다.

 AfxTrace의 함수 원형

void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)

{

    va_list args;

    va_start(args, lpszFormat);

    int nBuf;

    TCHAR szBuffer[512];

    nBuf = _vsntprintf(szBuffer, _countof(szBuffer), lpszFormat,

args);

    // was there an error? was the expanded string too long?

    ASSERT(nBuf >= 0);

    if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))

        afxDump << AfxGetApp()->m_pszExeName << ": ";

    afxDump << szBuffer;

    va_end(args);

}




 개인적으로 정확히 알지는 못하지만 여러 가지 예외 현상이 발생할 소지가 많기 때문에 사용을

피하라고 알고 있어서 잘 사용하지는 않는다.

 일단 버퍼 사이즈가 512byte로 잡혀 있는데 저 사이즈를 넘을 때도 문제가 생길수 있다.

 따라서 디버깅이 필요할 경우 자신의 매크로를 만들어 사용하는 것이 좋다고 해서 매크로를

직접 만들어 사용한다.

ex) MyOutputDbgStr( , )

MYRESULT MyOutputDbgStr(MYRESULT MyReturn, const char *pszFmt, ...)

{

    TCHAR   sz[512];
    va_list vargs;
    const char* pszFormat = pszFmt;
 
    va_start(vargs, pszFmt);
    wvsprintf(sz, pszFormat, vargs);
    va_end(vargs);
   
    OutputDebugStringA(sz);
    return MyReturn;
}


 사용 예

 #define TraceResult()                                                                            \
 (MyOutputDbgStr(TRUE, "%s(%d) : *** TRACE *** \n", __FILE__, __LINE__))

 if(error)   TraceResult();

 출력

 d:\work\testTrace\trace.c(17) : ***TRACE***