원본 : http://www.debuglab.com/knowledge/filetrace.html
1.요약
MFC에서 말입니다. 모든 트레이스를 파일로 하도록 바꿔봅시다.
예전에 어떻게 좀 해볼라고 하다가 실패했는데, 간단하고도 효과적인 방법이 무수히 많이 있습니다. 그중에 하나!
2.본문
트레이스를 저장할 로그 파일을 하나 만듭니다. 아무래도 프로그램이 살아있는 내내 써야할테니 전역적으로 만드는 것이 좋겠죠..
CFile dumpFile;
프로그램이 시작할 때 다음과 같이 해줍니다.
dumpFile.Open(_T("dump.log"), CFile::modeWrite | CFile::modeCreate);
afxDump.m_pFile = &dumpFile;
끝입니다.
자.. 위와 같이 했다고 치고 다음과 같이 사용하면 어찌 될까요?
_RPT0(_CRT_WARN, "RPT0\n");
TRACE("trace..\n");
afxDump << "afxDump\n";
ATLTRACE("atltrace\n");
위에 3개는 잘 나오지만 ATLTRACE 에서는 안됩니다.
왜냐면, ATLTRACE 는 OutputDebugString() API 로 구현되었기 때문이죠.
TRACE 매크로는 afxDump 를 사용해서 구현됩니다.
그리고 afxDump는 AfxOutputDebugString()을 사용해서 구현됩니다.
AfxOutputDebugString() 은 debug 버전에서는 _RPT0 매크로를 사용하고 release 버전에서는 OutputDebugString() 을 사용합니다.
자, 위에 글을 또박또박 읽으셨을 분은 많지 않으리라 생각합니다만
어쨌든, 위와같은 사실을 두고 봤을때 afxDump 에 파일을 대입한 것이 _RPT0 에게 까지 영향을 미친다는 사실은 신기하지 않을 수 없습니다.
원인은 다음과 같습니다.
CRT 는 trace를 hooking 할 수 있도록 _CrtSetReportHook() 라는 함수를 두고 있습니다. MFC는 다음과 같이 사용하고 있군요.
pfnOldCrtReportHook = _CrtSetReportHook(_AfxCrtReportHook);
-----------------------------------------------------------
물론 좋은 툴을 사용할 줄 아는 지혜도 필요하겠죠.
www.sysinternals.com 에 가셔서 DebugView 라는 유틸을 받아서 사용해 보세요.
3.예제
4.참고
Debugging Windows Programs, Strategies, Tools, and Techniques for Visual C++ Programmers p.138,139
MFC, ATL source code and MSDN.
- 2001.08.13 Smile Seo -
- Set Next Statement 를 통해서 디버깅 하기 (0)2007/03/23
- 파일로 트레이스 하도록 바꾸기 (3줄이면 됨) (0)2007/03/21
- Watch 창에서 함수 실행하기 (0)2007/03/21
- 소스로 바로가는 TRACE (0)2007/03/19
- LastError를 보여주는 Debugging Trace Macro (0)2007/03/05

수안이의 컴퓨터 연구실



Leave your greetings.