Calendar

«   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      

Site Stats

Total hits:
167456
Today:
31
Yesterday:
93

[펌] WinDbg를 이용해서 컴파일 후 파일 debuggee로 자동 복사하기

드라이버를 개발하면서 WinDbg 로 커널 디버깅을 할 때 가장 귀찮은 작업중 하나가
Debugger(개발시스템)에서 드라이버를 빌드한 후에 이것을 Debuggee (테스트시스템)로
복사해줘야 한다는 것입니다.
이것을 해결해 주는 편리한 명령어가 있었으니 바로 .kdfiles 입니다.

.kdfiles (Set Driver Replacement Map)
.kdfiles command 는 맵파일을 읽어서 그 내용에 있는 대로 Debugger 시스템에 있는
드라이버 파일을 Debuggee 시스템에 복사하게 합니다.

[Syntax]
.kdfiles MapFile ( MapFile 을 읽는다 )
.kdfiles -c         ( 현재 설정을 지운다 )
.kdfiles             ( 현재 설정을 보인다 )

파일복사는 커널 디버거가 연결된 통로로 이루어집니다. Serial 디버깅이면 Serial,
1394 디버깅이라면 1394죠. 파일복사이므로 파일이 큰 경우 당연히 1394 권장입니다.

이해가 잘 안가시죠?
예제를 통해 확인해 보겠습니다.

kd> .kdfiles
No KD file associations set

이게 일반적인 상황입니다.
다음과 같이 설정할 수 있습니다.

kd> .kdfiles d:\dbgmap\mymap.ini
KD file assocations loaded from 'd:\dbgmap\mymap.ini'

mymap.ini 파일의 내용은 다음과 같습니다.

# [주석] mydrv.sys 에 대한 맵
map
\Systemroot\system32\drivers\mydrv.sys
D:\mytest\mydrv\Build\I386\checked\mydrv.sys

내용은 debuggee 의 \Systemroot\system32\drivers\mydrv.sys 는 debugger 시스템의 D:\mytest\
mydrv\Build\I386\checked\mydrv.sys 를 가져와서 사용하도록 해 달라는 의미입니다.
아래와 같이 설정된 내용을 확인할 수 있습니다.

kd> .kdfiles
KD file assocations loaded from 'd:\dbgmap\mymap.ini'
\Systemroot\system32\drivers\mydrv.sys -> D:\mytest\mydrv\Build\I386\checked\mydrv.sys

실제 파일 교체는 드라이버 로드시에 이루어 집니다. 리부팅은 필요없습니다.
테스트시스템의 드라이버를 로드하려는 순간 debugger 측에서 지정된 폴더의 파일을 전송하고
테스트시스템의 드라이버가 전송된 파일로 교체된 후에 드라이버가 로드됩니다.
이 때 다음과 같은 메시지가 뿌려집니다.

KD: Accessing 'D:\mytest\mydrv\Build\I386\checked\mydrv.sys' (\SystemRoot\system32\drivers\mydrv.sys)
  File size 64K........................
MmLoadSystemImage: Pulled \SystemRoot\system32\drivers\mydrv.sys from kd

Windows File Protection (WFP)과 관계없이 교체되구요 부팅하는 시점이더라도 드라이버가
로드되면 교체됩니다.

드라이버 자동 복사가 필요없어지면 다음 명령으로 설정을 지우면 됩니다.

kd> .kdfiles -c

이 명령을 알고 있으면 수동으로 파일을 복사하는 작업이 없어져서 아주 편리합니다.
하지만 가끔 원하지 않게 빌드된 드라이버 파일이 무심코 복사되기도 하지요. ^^

참고로 맵파일 작성시 다음과 같은 포맷도 가능함을 보여드립니다.

# Symbolic Link Example
map
\??\c:\windows\system32\beep.sys
\\myserver\myshare\new_drivers\new_beep.sys

복사할 곳 지정시 심볼릭링크 표현으로 어느 위치던지 지정할 수 있습니다.
원본위치 지정시 네트웍에 있는 위치도 지정할 수 있습니다.

그리고 안타깝게도 .kdfiles 명령어는 타겟시스템이 XP 이후인 경우만 동작합니다.

greemate 테스트 시스템의 드라이버 경로는 시스템에 등록된 드라이
버의 ImagePath 와 동일해야 합니다. ImagePath 에 \??
\c:\windows\system32\drivers\mydrv.sys 와 같이 등록되
어 있다면 위 설정은 동작하지 않습니다. 이 때는 맵파일
의 내용을 다음과 같이 작성해야 합니다.

map
\??\c:\windows\system32\drivers\mydrv.sys
D:\mytest\mydrv\Build\I386\checked\mydrv.sys


펌 : www.driveronline.org


2007/11/19 17:49 2007/11/19 17:49

Posted by

,
Response
No Trackback , No Comment
RSS :
http://kuku.pe.kr/rss/response/181

Leave a comment

자자!! 이제 VMWARE도 깔았겠다... WINDBG를 깔아 봅시다 쿠쿠

오호!!! 작동은 한다 ㅡ.ㅡ;;; 그러나 사용법은 아직 잘 모른다 쿠쿠

하나하나 익혀나가야지~~~ 쿠쿠 설레여 막 요래!!

--------------------------------------------------------------------------------------------------------------------------------------------
WINDBG 최신버전 받는 곳 : http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

참조 할 사이트 : http://snoya.ye.ro/driver/windbg/windbg.html
                                http://www.codeproject.com/debug/windbg_part1.asp <= WINDBG 사용법!!!
                                http://somma.egloos.com/1627566 <= 이분 블로그.. 자주 가보게 되네... 찾다보면 다 걸리네..

1. 첫단계


- 그럼이제 따라하기 시작해봅시다. 일단 위 WinDbg 다운로드 하셔서 프로그램을 설치합니다.

   그리고 바탕화면에 생성된 아이콘의 속성을 선택하여 프로그램 파일뒤 파라미터 설정을하게 됩니다.

   이 파라미터는 가상머신과 서로 통신을 하게될 포트를 설정하게 됩니다. 가상머신과 서로 통신하게 될 포트명은

  xcom 으로 하겠습니다.

  C:\WINDDK\windbg\windbg.exe -k com:pipe,port=\\.\pipe\xcom <= 요기 아래그림과 다르게 수정!





2. 두 번째 단계


- 위설정이 끝났으면 이제 가상머신 즉 윈도우 2000/xp 내 c:\ 에 있는 boot.ini 파일을 수정하는 것입니다.

   이파일이 안보이면 탐색기 속성에서 시스템화일 보이기 옵션을 체크합니다. 파일 수정은 아래처럼 하시면 됩니다.

   즉 실제 컴퓨터와 통신하게될 포트와 통신속도를 설정합니다. 이설정은 가상머신의 컴퓨터 부팅시 디버그모드로

   부팅하기 위한 설정입니다.

   multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Debug" /fastdetect /debugport=COM1 /baudrate=115200





3. 세 번째 단계


- 세 번째 단계는 깔려있는 가상머신 운영체제의 설정입니다. 기본적으로 가상머신에 os를 깔았을 경우 아래처럼 Serial 포트는

    추가 되지 않습니다. 그렇기 때문에 Add 버튼을 눌러서 Serial Port를 추가합니다.


VMWARE에서 하는 부분이다 ㅡ.ㅡ; 난 장치관리자 가서 삽질했네 쿠쿠

1)  Add 버튼 클릭후 아래처럼 Output to named pipe을 선택합니다.


   


2) 그리고다음 설정으로 그림처럼 Named pipe에 위에서 지정한 통신 포트명 xcom으로 바꾸어 줍니다.


   


3) 이렇게 시리얼포터 추가 설정이 끝나면 아래처럼 xcom 시리얼 포트가 추가된걸 보실수 있습니다.

 

   





4. 네 번째 단계



- 이렇게 되면 일단 실제 컴퓨터와 가상머신간의 시리얼포트를 통한 연결설정이 끝나게 됩니다. 이제부터 이렇게 설정된걸

   토대로 연결을 시도해보겠습니다. 일단 가상머신을 실행시킵니다. 중요한 것은 가상머신을 실행시키고 난 다음 바로

   위에서 설정한 WinDbg의 아이콘을 누릅니다. 가상머신이 어느정도 실행되면 아래처럼 선택할 수 있는 모드가 나옵니다.

   위에서 boot.ini에서 설정한 모드가 나오는겁니다. 일단 디버그를 위한 것이니 Debug로 선택해서 부팅을 합니다.






- 위에처럼 가상머신을 구동함과 동시에 WinDbg프로그램을 실행시키고 부팅완료되면 아래처럼 정상적인 로딩된 화면이 나옵니다.

   여기서 하나 빠뜨렸군요. 윈 WinDbg를 설정시 심블을 등록해야 합니다. 이것은 직접 다운로드 하여 깔 수 있으나

   인터넷을 통해서 심블을 등록할 수가 있습니다.

   WinDbg의 File -> Symbol File Path -> 아래내용을 추가합니다.

   SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols;C:\WINDDK\pmdnf\objchk\i386

   



5. 다서번째 (마지막 디버깅)


- 자 위에서와 같은 설정이 아무 문제없이 끝났다면 이제부터 디버깅을 위한 준비는 끝났습니다.

   일단 가상머신의 운영체제가 현재 부팅중이라면 Ctrl+break 키를 통시에 누르면 디버깅을 위한 콘솔로

   빠지게 됩니다. 아래처럼 kd > 프롬프트 있는곳에 원하는 디버깅 명령어를 입력하여 디버깅을 하실수 있습니다.

   이때는 가상머신의 운영체제는 머져 버릴 것입니다. 다시 원상태로 구동하시며면 콘손에다 g를 누르시면 됩니다.

   자세한 명령어는 WinDbg 도움말을 참조하십시요.




- 컴퓨터와 연결된 상태에서 드라이버의 잘못으로 블루스크린이 발생하면 WinDbg에서 오류에 대한 보고서를 만들어 줍니다.

   실제는 블루스크린 발생이전에 만들어주죠. 아래처럼 블루스크린이 최종적으로 뜨기전에 WinDbg안에서 콘솔모드로

   빠져나오게 됩니다. 그리고 이에대한 분석을 하시려면 콘솔에서 !analyze -v를 치면 보고서에 대한 내용을 보여줍니다.

   몰론 더 많은 명령어는 도움말을 참조하십시요.



- 위에서 !analyze -v를 사용해 드라이버의 잘못된 곳에 대한 보고내용을 보여줍니다. 아래 그림처럼 현재

   KeSetEvent()함수에서 뭔가 잘못되었음을 알 수가 있습니다. 드라이버의 잘못으로 꼭 디버깅모드로 오는 것은

   아닙니다. 비주얼 스튜디어 처럼 브레이크 포인트를 걸어서 하나 하나 디버깅이 가능합니다. 자신의

   소스를 불러와서 F9키를 눌러서 브레이크 포인트를 잡고 가상머신을 운영중이면, 이 브레이크를 걸은 지점에

   걸렸을 경우 자동으로 디버깅 콘솔모드로 빠져나와서 동작상태를 확인할 수가 있습니다.



- g 키를 눌러보면 이제 블루스크린이 뜨는걸 확인하실수가 있습니다.



< 펌 : http://blog.naver.com/j_c_hong?Redirect=Log&logNo=80006524810 >


2007/07/06 22:36 2007/07/06 22:36

Posted by

Response
No Trackback , No Comment
RSS :
http://kuku.pe.kr/rss/response/107

Leave a comment