티스토리 툴바


달력

02

« 2012/02 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  •  
  •  
  •  

'Programming/WD'에 해당되는 글 5

  1. 2010/04/30 동기화 개체
  2. 2010/03/26 바이너리에 맞는 심볼 다운로드 받기
  3. 2010/03/26 WinDbg에서 DbgPrintf 보기
  4. 2010/03/18 개발자 사이트 모음
  5. 2010/01/15 드라이버 유닛 테스트
2010/04/30 16:31

동기화 개체 Programming/WD2010/04/30 16:31

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
윈도우 드라이버 작성할 때에 꼭 동기화 개체 이야기가 나온다.
물론 락이 아예 필요없는 구조로 가는게 더 좋은 방법이지만...
멀티 스레드 기반이니, 동기화 개체를 안 쓸래야 안 쓸 수도 없어 보이기도 하다(^^)

lock-free, wait-free 등을 쓰고 싶으나, 일반 구현은 CAS 명령어에 의존하는 형편이다.
하지만, 64비트에서는 인라인 어셈을 원초적으로 거부하는 형식이라, 외부 어셈을 달아 써야 한다.
글구 너무 플랫폼에 종속이 되버린다.
완전히 알고리즘적으로 해결한 경우는 못 찾아서 내부적인 자료구조임에도 불구하고 계속 동기화 개체를 찾아 써야 하는 상황이다.
STM 등을 고려해 볼까 했는데, 마음만 바쁘다.

암튼...다음은 윈도우 비스타 기준으로 나온 동기화 개체 일람이다.


락 프리가 되면 내 드라이버를 엄청나게 느려지게 만드는 KeEnterCriticalRegion 따위는 안 써도 될 텐데...


  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
Posted by Joy to the World! learder
  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
윈도우 버전만 잘 알아서 디버그 심볼 설치 파일을 받으면 된다
그다지 신통치 않으면 이렇게 해보자.

windbg 가 설치된 폴더를 잘 보면, symchk.exe 라는 심볼 유틸리티가 있다.
이것으로 강제로 가지고 오도록 하자.

symchk /r c:\windows\system32 /s SRV*C:\debugsymbols*http://msdl.microsoft.com/download/symbols

앞에 주소는 체크할 바이너리가 있는 곳이고, 뒤에 주소는 심볼 서버 주소에, 심볼을 저장할 위치이다.


WinDbg 안에서 처리하려면...

.sympath SRV*f:\localsymbols*http://msdl.microsoft.com/download/symbols
.reload

하자~



  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
TAG WinDbg, 심볼
Posted by Joy to the World! learder
2010/03/26 10:56

WinDbg에서 DbgPrintf 보기 Programming/WD2010/03/26 10:56

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
비스타 이전에는 굳이 설정안해도 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 장에서 각 디바이스 드라이버별로 어떻게 하는지 살펴보는 것이 최선이다.

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
TAG WD, WinDbg
Posted by Joy to the World! learder
2010/03/18 15:35

개발자 사이트 모음 Programming/WD2010/03/18 15:35

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!

WinDbg 관련

말많은 인캅스3 지우기 여기서 보려면 더보기 클릭~

더보기

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
TAG WinDbg
Posted by Joy to the World! learder
2010/01/15 08:47

드라이버 유닛 테스트 Programming/WD2010/01/15 08:47

  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
유닛 테스트

- 드라이버 DriverEntry 에서 바로 테스트하자. 로드 실패하면 되니까.

BOOLEAN testUnitTest()
{
#if defined(DBG)
   ...
#endif
   return TRUE;
}

NTSTATUS 
DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{
    ...
    if ( !testUnitTest() )
    {
     return STATUS_ACCESS_DENIED; 
    }
   ...
}
  도움 되셨나요? 꼭 댓글이나 트랙백을 남겨주세요!
TAG WD, 테스트
Posted by Joy to the World! learder