티스토리 뷰

비스타 이전에는 굳이 설정안해도 verbose 모드이면 디버그 메시지가 잘 나왔었던 것 같다.
그런데, 비스타부터는 디버그 메시지 필터링 레지스트리를 설정해야 한다.
이유인즉 비스타부터서는 DbgPrint 를 DbgPrintEx 로 매핑시켰기 때문이란다(http://www.osronline.com/article.cfm?article=295). DbgPrintEx는 레지스트리 설정값에 따라 출력할 수도 안할 수도 있다.

간단하게 모든 디버그 메시지를 보고 싶다면,

WinDbg 프롬프트에서
ed Kd_DEFAULT_MASK 0xf 
이제부터 잘 보인다.

물론 재부팅 후에는 다시 설정해 줘야 한다. 귀찮으니까, 디버깅을 할 PC에서 레지스트리를 설정해 버리자.
레지스트리 HKLM\SYSTEM\Current Control Sets\Control\Session Manager\ 에서 
Debug Print Filter  거기에 'DEFAULT'라는 DWORD 값으로 0xF 을 주자.
그리고 리부팅하면 적용된다.

좀 더 알고 싶다면 다음...
참고로 여기서 'DEFAULT'는 모든 드라이버 그룹이고, 0xF는 레벨 마스크 값으로 모든 레벨의 디버그 메시지를 출력하라는 것이다.

각 드라이버 종류(WinDbg에서는 컴포넌트라고 하더라)별로도 디버그 메시지를 보여주는 레벨을 설정할 수도 있다.
방금 전에는 'DEFAULT'라고 넣었던 값을 디바이스 컴포넌트명으로 설정하여 추가하면 된다.

처음에 보았듯이 이 값들은 WinDbg 에서 실시간으로 변경이 가능하다. 그런데, Kd_XXX_MASK 를 형식의 값을 알아야 한다. 이건 아마도 레지스트리 HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList 여기서 쉽게 찾아볼 수 있는 서비스 그룹명인 것 같다(?).

타이핑하기 싫다면, http://www.osronline.com/article.cfm?article=295 요기서 SetDbgPrintFiltering 프로그램을 사용해보자.

여기 필터링 값에 대한 자세한 설명은 WinDbg 도움말에 'Reading and Filtering Debugging Messages' 섹션에 나오는데, 참고하면 이렇더라.

#define   DPFLTR_ERROR_LEVEL     0
#define   DPFLTR_WARNING_LEVEL   1
#define   DPFLTR_TRACE_LEVEL     2
#define   DPFLTR_INFO_LEVEL      3
#define   DPFLTR_MASK    0x8000000

위에 레벨은 비트 번호이다. 실제 설정할 마스크 값을 잘 구해야 하겠다.
알겠지만, 모든 메시지를 보이는 마스크 값으로 0xF 을 사용했었는데, 이는 위에 DPFLTR_ERROR_LEVEL 부터WARNING, TRACE, INFO 등 모든 레벨을 다 조합한 값이다.

이외의 경우의 디버그 메시지 출력 방법은 http://support.microsoft.com/kb/314743 을 찾아보자.
물론 WinDbg 도움말에서 Debugging Techniques 장에서 각 디바이스 드라이버별로 어떻게 하는지 살펴보는 것이 최선이다.

댓글