ATL / MFC 추적도구

Visual Studio 제품군에는 프로그래밍 개발에 아주 유용한 tool 들이 많이 있습니다
예를 들어 두개의 파일 중에 다른 점을 찾아주고 몇번 째 라인이 몇번 째로 이동했는지를 알려주는 WinDiff가 있겠구요.
마우스나 키보드 메세지, 또는 시스템 메세지가 어떻게 들어오는 지를 알 수 있는
아주 유용한 Spy++가 있습니다.

그러나 Windows 프로그래밍을 해본 경험이 있다면, WM_PAINT 메세지에 대한 디버깅을 위해서 break point를 사용하지는 않을 것입니다. 왜냐하면 화면이 보이는 순간 바로 break가 걸릴 테니까요
혹은 WM_MOUSEMOVE는 어떨까요?

그래서 저런 것들을 디버깅하기 위해서는 TRACE라는 매크로를 사용하지요?
TRACE(_T("OnPaint was called %d times\n"), nCount) 이런 식이 되겠네요

그런데 윈도우가 보내는 모든 메세지를 다 보고 싶을 때는 어떻게 하세요?
Spy++로 일일히 프로세스를 찾아서 메세지를 보시나요?
그것도 훌륭한 방법입니다.
그러나 때때로는 귀찮습니다.

사실 output창에는 저런 윈도우 메세지들이 다 표현됩니다. 언제 메세지를 받았고
그 메세지가 언제 PumpMessage 되었는지를요. 또한 hwnd값고 msg 값도 당연히 보이겠지요.
한번도 그 메세지를 보신적이 없다구요?

그러면 Visual Studio를 켜보세요.
도구 메뉴에 ATL/MFC 추적 도구라는 항목을 실행해보세요

예전에 다들 한번씩 실행해 봤던 도구였죠?
그리고 이게 뭐야?! 하면서 그냥 종료했던 도구였을 테구요

그러면 아직 사용법을 모르고 계신 것 뿐입니다

자. 이제 프로젝트를 하나 열어서 디버깅을 해봅시다.
F5를 눌러서 디버깅을 시작하고
다시 ATL/MFC 추적도구를 실행해 봅시다.
그러면 추적 목록에 현재 디버깅 중이 프로그램의 이름이 올라 올 것입니다.


그러면 추적메세지의 양을 선택할 수 있게 슬라이더 컨트롤이 활성화 되었죠?
각 모듈 별로도 추적메세지의 양을 조절할 수 있습니다.
당연히 각각 설정한 내용들을 trc 파일로 저장할 수 있고 그 파일을 다시 로드할 수도 있겠지요?

그러면 일단 추적 메세지 양을 가장 많음으로 하고 visual studio의 output 창을 한번 보도록 합시다.

WndProc: hwnd=0x00051136, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00051136, msg = WM_NCPAINT (0xF904207B, 0x00000000)
WndProc: hwnd=0x00051136, msg = WM_ERASEBKGND (0x51011723, 0x00000000)
WndProc: hwnd=0x000810F6, msg = WM_DRAWITEM (0x000007D9, 0x0012D86C)
WndProc: hwnd=0x00051136, msg = 0x0000 (0x00000000, 0x00000000)
WndProc: hwnd=0x00051146, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00051146, msg = WM_NCPAINT (0xFC04207B, 0x00000000)
WndProc: hwnd=0x00051146, msg = WM_ERASEBKGND (0xB10120C3, 0x00000000)
WndProc: hwnd=0x000810F6, msg = WM_DRAWITEM (0x000007DC, 0x0012D86C)
WndProc: hwnd=0x00051146, msg = 0x0000 (0x00000000, 0x00000000)
WndProc: hwnd=0x00031170, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00031162, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00031162, msg = WM_NCPAINT (0x00000001, 0x00000000)
WndProc: hwnd=0x00031162, msg = WM_ERASEBKGND (0xAE0120C4, 0x00000000)
WndProc: hwnd=0x00031170, msg = WM_DRAWITEM (0x00000001, 0x0012D86C)
WndProc: hwnd=0x00031162, msg = 0x0000 (0x00000000, 0x00000000)
WndProc: hwnd=0x00041166, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00041168, msg = WM_PAINT (0x00000000, 0x00000000)
WndProc: hwnd=0x00041168, msg = WM_NCPAINT (0x00000001, 0x00000000)
WndProc: hwnd=0x00041168, msg = WM_ERASEBKGND (0x650115B7, 0x00000000)
WndProc: hwnd=0x00041166, msg = WM_DRAWITEM (0x00000001, 0x0012D86C)

위와 같은 모습이 보이십니까?
모든 메세지가 다 표현되어서 약간은 어지럽게 느껴질 수도 있겠지만,
추적 도구의 범주 및 함수 이름, 파일 이름 및 줄 번호 옵션을 사용하면 막강한
기능임에 틀림없습니다.
chaoskcuf
프로그래밍/TIP& Study 2006/08/28 01:45

트랙백 주소 : http://chaoskcuf.com/trackback/16

댓글을 달아 주세요

Powerd by Textcube, designed by criuce
rss