Programming/Kernel / Driver2008. 12. 5. 17:41



I. 디버깅

1. 기본 디버깅 환경

Windows Driver 디버깅을 위해선 다음 그림과 같이 디버깅용 컴퓨터가 필요합니다. 디버깅 컴퓨터에는 타겟 컴퓨터와 같은 운영체제가 로딩되어 있어야 하고 디버깅을 위한 프로그램이 필요합니다. 디버깅 프로그램은 DDK에서 제공하는데 자세한 사용법은 도움말을 참조하시기 바랍니다.

Debugger                         Debuggee

 

그림에서 있듯이 컴퓨터간의 데이터 교환은 RSC-232 직렬 통신을 통해 이루어 지는데 통신에 필요한 케이블은 다음 그림과 같이 만들어 사용하면 됩니다.

2. Windows 2000/XP에서 디버깅 환경

디버깅을 시작하기 이전에 컴퓨터간의 통신 속도를 맞춰줘야 하고 타겟 컴퓨터를 디버그 모드 설정 해야 합니다. Windows NT 계열에서는 다음과 같이 boot.ini 파일에 다음과 같이 추가해 주면 부팅 디버그 모드로 부팅할 일반 모드로 부팅할 사용자에게 묻는데 이때 디버그 모드를 선택해 주면 디버그 모드로 부팅하게 됩니다.

[boot loader]

timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /debugport=com1 /baudrate=57600

통신 속도 설정은 위의 내용을 보면 알겠지만 /debugport 직렬 케이블이 연결된 포트이고 /baudrate 통신 속도를 나타냅니다. 여기에 설정된 속도와 Windows 2000 DDK에서 제공하는 디버깅 프로그램에서의 속도를 맞춰주면 됩니다.

 

다음은 Windbg 실행하여 환경설정을 하고 디버깅 하는 방법입니다.

1 방법은 ddk 설치 같이 설치 되는 windbg 실행 방법이고, 2번의 방법은 최신 Windbg6.2.7.4 실행 방법입니다.  2번의 Windbg6.2.7.4 사용하는 것이 사용하기에도 쉽고 자세한 디버깅을 있습니다.

 

1) 기본 windbg실행

View->Options 선택했을 뜨는 창으로 포트, 속도 Flags 다음과 같이 설정해 주면 됩니다.

참고로 디버그 모드로 부팅하였는데 Windbg 디버깅에 관련된 아무런 내용도 출력되지 않을 시에는 Windbg에서 디버깅 명령인 ‘Ctrl+C’ ‘g+ Enter’ 번갈아 눌러 주시면 디버깅 내용이 출력됩니다.

 

 

 

2) Windbg 6.2.7.4

다운 방법: http://www.microsoft.com/whdc/ddk/debugging/installx86beta.mspx 에서

Install 32-bit Beta Version 6.2.7.4 (April 29, 2003) 8.2 MB 클릭하여 다운 받으시기 바랍니다.

 

실행 화면

 

kernel debugger 실행

 

 

속도와 포트 설정

 

위와 같이 하면 기본적인 디버깅은 설정이 됐습니다.

 

추가적으로,

File->Symbol File Path

: 드라이버를 컴파일 하면, xxx.pdb파일이 xxx.sys파일과 같이 생성되는데, 파일을 등록 해주면, break 경우( ) bluescreen) 해당 소스에 line 함수 명들과 같은 자세한 정보가 출력이 됩니다.

xxx.pdb파일을 symbol(심볼) 파일이라고 합니다. 파일은 컴파일 드라이버 파일에 대해 함수위치와 소스정보에 대해 가지고 있습니다. 그래서 관련 파일이 로딩되면, 컴파일 소스에 대한 정보(함수들, 소스의 line 정보(소스가 있다면)…) 얻을 있습니다.

등록방법은 File->Symbol File Path 클릭할 경우, 심볼 파일의 경로를 설정하여주면, 해당 경로의 심볼을 로딩하게 됩니다. 심볼이 바뀐 경우에는 Reload check 줍니다.

 

그림을 보면, 심볼이 세미콜론으로 2개가 등록이 되어있습니다.

SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols

: web으로 관련 심볼을 다운받는 것입니다. 예전에 심볼을 미리 다운받아서 위치를 지정해 주었지만, 지금은 필요할 경우 웹에서 직접 다운 받는다. 심볼파일 중에는 ndis.sys 같은 커널 함수들에 대한 심볼들을 포함하고 있어서 커널 소스는 없어도 함수 이름 등은 수가 있습니다.

c:\symbols

: 경로는 사용자가 추가해 주는 심볼 파일 경로입니다. 사용자가 컴파일해서 만들어진 심볼파일을 폴더에 복사해놓으면 심볼이 로딩됩니다.

 

아래의 그림은 심볼이 등록되었음을 보여주고 있습니다.

 

File->Source File Path

소스의 경로를 지정해 줍니다. 소스를 로딩 경우, break 지점이 소스 내에 있으면, 해당 소스의 라인에서 p명령어를 치며, 디버깅을 나갈 있습니다.

 

View

MFC 에서 디버기을 메모리, 디스어셈블, 스택 등을 있듯이 여기서도 있습니다.

 

3. 디버깅 명령어

Windows 드라이버의 디버깅은 Windows Visual Studio와는 달리 사용자가 디버깅 명령을 직접 입력하는 방식으로 진행됩니다. 디버깅을 위해선 여러 가지 디버깅 명령어들을 다룰 있어야 되는데 디버깅 명령어에 대한 자세한 내용은 DDK 도움말을 참고하시기 바랍니다.

다음은 디버깅에서 많이 사용하는 명령어를 정리한 것으로 정도의 명령어로도 간단한 디버깅은 충분히 수행할 있을 것이라 생각됩니다.

명령어

Ctrl + C, Ctrl + Break

일시 중지

g

계속 진행

bp

Break Point 설정 ) bp SnSReceive

bl

Break Point List 보기

p

Asm 명령어 줄씩 디버깅

bc

Break Point 삭제 ) bp SnSReceive

db, dw, dd

메모리 덤프

Ln cs:eip

현제 타겟 컴퓨터의 실행 위치

?

명령어 도움말

.reboot

타겟 컴퓨터 재부팅

 

. !analyze -v

디버기(debugee) BlueScreen 발생하거나, 시스템에 문제가 있을 경우, Windbg 프로그램은 break 걸리게 된다. 이때 break 원인을 자세히 알기 위해서 !analyze -v명령을 명령줄에 치면, 자세한 정보를 얻을 있다.

 

 

 

 

 

4. Windows 98에서 디버깅 환경

디버깅을 시작하기 이전에 컴퓨터간의 통신 속도와 사용할 포트를 맞춰줘야 하고 디버깅이 시작될 타겟 컴퓨터를 디버그 모드 시작해야 합니다. Windows 98 에서는 컴퓨터간의 통신 속도를 맞추기 위해서 다음과 같은 절차가 필요합니다.

 

1) 타겟 컴퓨터에서 해야할 .

a)       타겟 컴퓨터에 98DDK 설치되어 있어야 한다.

b)       설치된 경로를 C:\98DDK라고 하면 C:\98DDK\bin\Runwdb98.bat 파일의 내용을 다음과 같이 수정해야한다.

수정전: @wdeb98 %1  /n  /x  /c:2  /r:19200  /f:runwdeb.wrf  ..\win.com

수정후: @wdeb98 %1  /n  /x  /c:1  /r:19200  /f:runwdeb.wrf  c:\windows\win.com

 

여기서 통신속도(/r) 사용자가 정해주는 값으로 19200 사용해도 되고 다른 값으로 사용해도 된다. 하지만 값은 반드시 디버거의 Rterm98.exe에서 사용하는 값과 같아야 한다. 디버깅을 하다가 종종 출력되는 내용이 깨지는 경우가 있는데 이럴때는 통신속도를 변경하여 알맞은 속도로 설정해주면 된다. 포트에 해당되는 것은 ‘/c’ 이다. 값도 기본적으로 2 되어있고 그대로 사용하면 된다. 중요한 것은 어떤 포트를 사용하느냐가 아니라 시리얼케이블이 연결된 포트와 /c 포트와 일치해야한다는 것이다. “/f:runwdeb.wrf” 심볼파일을 등록할 사용하는 파일로 부분에 대해서는 ‘c)’ 자세하게 기술하겠다.

c)       C:\98DDK\bin\ runwdeb.wrf 내용은 아래와 같다.

사용자가 드라이버 소스를 컴파일해서 만들어진 심볼파일을 SnSDrv.sym이라고 하면 위의

림과 같이 기입해주고 SnSDrv.sym 파일을 C:\98DDK\bin 복사해주면 디버깅시 심볼이 등록

된다.

 

98DDK에서는 이러한 심볼파일들을 다음과 같이 제공하고 있다.

98SE: 98ddk CD \DEBUG_WINDOWS98SE\Retail\

98: 98ddk CD \Dbg_sym\Retail\

 

아래의 그림은 디버깅이 시작될 심볼이 등록되었음을 보여주는 화변을 캡쳐한 것이다.

 

2) 디버깅 컴퓨터에서 해야할 .

a)       디버깅 컴퓨터에 98DDK 설치되어 있어야 한다.

b)       C:\98DDK\bin\Rterm98.exe 실행한다. 다음은 실행한 화면이다.

c)       메뉴에서 “Settings->Options ” 선택하면 아래와 같은 창이 뜬다.

d)       위의 그림과 같이 설정해주면 타겟 컴퓨터에서 설정한 통신속도와 포트가 일치한다.

e)       확인 누른다.

 

3) 디버깅하기

a)       이제 모든 환경이 설정되었다.

b)       디버깅 컴퓨터에서는 C:\98DDK\bin\Rterm98.exe 실행한다.

c)       타겟 컴퓨터에는 디버깅하고자하는 드라이버가 설치되어 있어야하고 심볼을 등록해주면 자세한 정보를 얻을 수가 있다.

d)       타겟 컴퓨터를 도스모드로 재부팅한다.

e)       C:\98DDK\bin\Runwdb98.bat 파일을 실행하면 디버깅 컴퓨터에 실행된 Rterm98 화면에서 디버깅되는 내용을 확인 있다.

Posted by skensita
Programming/Kernel / Driver2008. 12. 5. 17:37

앞에서 VMWare와 WinDbg를 연동하는 방법을 살표보았다.

 

  연동만 되었을 뿐 안에서 사용하는 함수들의 이름 같은 것을 확인하기 위해서는 심볼이 필요하다.

 

  이번에는 심볼 경로를 설정하여 디버깅을 좀 더 쉽게 할 수 있도록 설정하는 방법을 정리해보겠다.^^

 

  이번에도 스노야님의 강의를 많이 참고 하였다 (감사합니다~ ^_^)

==========================================================================================

 

자~ 레뒤 고~~

 

 

우선 커널 디버거를 켜보자~! 정상적으로 작동이 되었다면 "File - SymbolFilePath" 메뉴로 들어간 다음 아래 그림과 같이 경로를 지정해주자. 아래 경로는 MS사의 심볼 서버 경로입니다.

 

 

경로는 srv*C:\WebSymbols*http://msdl.microsoft.com/download/symbols 이다. 위 그림에서는 Reload란이 체크되어 있지 않지만 체크하도록 하자.!!

 

그리고 OK 버튼을 누르기 전에 아래 그림과 같이 C드라이브에 WebSymbols 디렉토리를 꼭 만들어 놓도록 하자. 

 

 

정상적으로 로드가 다시 되었다면 아래 그림과 같은 메시지를 출력할 것이다.

 

 

==========================================================================================

 

  앞에서 정리한 연동에 이어 심볼 경로까지 설정했다.

  이제 마음껏 커널을 파헤쳐보자!!@

 

  아~!! 커널을 파헤치기 전에 꼭 VMWare 스냅 샷을 찍어 놓도록 하자.

  예방 차원에서다.. 커널을 파헤치다 윈도우를 다시 깔아야 되는 수가 생기기 때문이다 ^_^

 

Posted by skensita
Programming/Kernel / Driver2008. 12. 5. 17:32

MS에서 배포한 커널 디버거인 WinDbg를 VMWare와 연동하는 것을 정리해보아야지~

아래 글은 내 생각대로 쓴 글도 있고 스노야님 께서 올려주신 강좌를 참조한(거의 배꼇다 ^^;) 부분도 있다.

 

 

대표적인 커널 디버거는 WinDbg와 SoftICE가 있지만 현재 SoftICE는 계발이 중지된 상태이다.

 

그래서 현재 가장 많이 사용되는 커널 디버거 툴이 WinDbg가 아닐까 한다. SoftICE와 다르게 WinDbg는 또 다른 컴퓨터를 디버깅할 수 있지 자기자신을 디버깅할 수 는 없다.

 

즉, 2대의 컴퓨터가 필요하다는 것이다. 하지만 VMWare를 이용하면 한 대의 PC로도 가능하다. 요즘은 PC의 성능이 좋아서 가상 머신정도는  돌리는 대는 별 지장이 없어보인다.

 

그럼 연동 하는 것을 스노야님 강좌를 참조하여 정리해 보자~!!!

 

==========================================================================================

 

우선 가상머신에 시리얼 포트를 추가해주어야 PC와 VMWare가 통신이 가능하다. 시리얼 포트는 "VM -> Settings -> Hardware" 탭에서 추가할 수 있다.

 

아래 그림은 시리얼 포트를 추가하는 모습을 차례대로 스크린 샷을 찍어 보았다.

 

 

 

 

 

 

 

 

 

여기에서 설정하는 파이프 이름이 WinDbg와 연동할 때 사용되는 이름이다.

 

 

 

 

위와 같이 하면 com_1이라고하는 시리얼 포트가 지정된다.(마지막 그림에서 I/O mode를 체크하는 이유는 잘 모르겠다 ^^;)  포트를 지정했으면 VMWare를 시작하여 부팅 시 디버그 모드가 작동할 수 있도록 boot.ini 파일을 작성하여야 한다.

 

아래는 boot.ini 파일을 수정한 그림과 수정 후 부팅과정에서 뜬 디버깅 모드이다.

만일 c: 루트디렉토리에 boot.ini 파일이 없다면 실행창에 "c:boot.ini"이라고 입력하면 창이 뜬다.

 

 

 

 

여기 까지 했으면 타겟 PC(여기서는 VMWare)의 설정은 끝났다. 이제 WinDbg를 설정하여 연결되도록 해야한다. 아래는 그림은 위에서 명명한 파이프 이름으로 WinDbg를 VMWare와 연동하는 모습이다.

 

 

설정은 끝났다. 정상적으로 연동이 되었다면 WinDbg를 켜놓은 상태에서 타겟 PC(VMWare)를 디버깅 모드로 부팅 시키면 아래 그림과 같이 WinDbg가 작동한다.

 

 

타겟 PC가 정상적으로 부팅된 후  WinDbg의 "Debug -> Break" 메뉴를 이용하여 타겟 PC의 커널을 마음껏 살펴 볼 수 있다. 아래 그림은 부팅 후 WinDbg를 이용하여 로드된 모듈을 확인한 모습이다.

 

 

 

==========================================================================================

 

이상으로 연동하는 것을 정리해 보았다.

Posted by skensita
Programming/Kernel / Driver2008. 10. 10. 11:17

Visual Studio 6.0 + vmware + windbg 개발환경 설정 정리 문서
Posted by skensita