OutputdebugString(), TRACE()


URL : http://simple21.egloos.com/3482925 

이번시간에는 OutputDebugString, TRACE에 대해서 알아보자. 이는 둘 다 Output 창의 Debug Tab에 디버깅 결과 값들을 표시하는 함수이다. 이는 원도우 프로그램에서 디버깅을 위해 편리하게 이용할 수 있다.

1.OutputDebugString()
이 함수는 디버깅 중에 Debug 창에 문자열을 표시하는 함수이다. 이후에 설명할 TRACE 유사(TRACE는 Debug모드에서만 동작, 하지만 이는 Release 모드에서 디버깅(다음에 설명) 중에도 문자열을 표시함)
- 만일 위의 Debug 창이 보이지 않으면 "[MENU]View/Output"을 선택

2.TRACE()
- OutputDebugString()과 거의 동일, Debug 모드의 디버깅 외에는 comment처리되어 무시
- printf와 동일한 형식을 지원하므로, 결과를 Debug 창에 보이기가 편리함
- TRACE1(), TRACE2(), TRACE3()과 같은 함수도 있지만, TRACE 다음의 숫자는 출력할 변수의 개수를 명시적으로 표시하는 것 외에는 TRACE와 동일, 그냥 이런 것도 있다는 정도만 알면 되겠음
아래는 TRACE()를 이용한 디버깅 결과이며, TRACE 결과물이 언제(Debug 모드로 디버깅 중에), 어디에(Output 창의 Debug Tab에) 표시되는지 꼭 알기를 바라며, 잘 이용하여 에러를 잡기를 바란다.

- "Win32 Console Application"에서 TRACE()문을 넣고, 컴파일을 하면, 아래의 링크 에러가 발생한다.
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
Debug/Debug_04.exe : fatal error LNK1120: 2 unresolved externals

이를 해결하기 위해서는 "[MENU]Project/Settings..."에서 General Tab의 Microsoft Foundation Classes:를 Not Using MFC외의 것으로 선택한다.

이렇게 하면 C/C++ Tab의 Preprocessor definitions에 _AFXDLL이 추가가 되는데, 여기서 TRACE는 AfxTrace를 내부적으로 호출하는데, 이렇게 함으로써 위의 링크 에러가 발생하지 않게 되는 것이다.

참고로 콘솔 프로그램에서 원도우의 class를 이용하려면, 아래를 만족하면 된다.
- Microsoft Foundation Classes:를 Not Using MFC외의 것으로 선택
- #include <afxwin.h>

마지막으로 혹시 Debug 모드에서 디버깅을 하여, TRACE()를 수행하여도 Output 창의 Debug Tab에 아무것도 나타나지 않는 경우가 있을 수 있는데, 이는 TRACE() 기능이 무시되도록 환경 설정되어 있기 때문이다. 이는 "[MENU]Tools/MFC Tracer"를 선택하여 아래의 그림처럼 Enable tracing을 체크하면 TRACE()가 올바르게 동작한다. 이 기능은 괴롭혀주고 싶은 상사의 환경설정에서 위 설정을 해제하여 혼동을 주는 것으로 활용할 수 있겠다.

댓글

Designed by JB FACTORY