WinDbg 사용법 본사이트내에서취득한모든문서나이미지, 기타정보의소유권은 하제소프트에있으며동의없는타사이트에의게재나배포, 상업적이용은불가합니다. 자료사용에관한문의는 webmaster@hajesoft.co.kr 로해주시기바랍니다. hajesoft Corp. 2005. Seoul. All Rights Reserved. 프로그램개발에서디버깅은전체개발의 50% 이상의비중을차지할정도로중요하다. 특히드라이버개발에있어서디버깅은더욱더중요한위치를가지기에마이크로소프트사에서무료로제공되는 WinDbg, 고가의상용프로그램이지만많이쓰이고있는 SoftIce 같은커널디버거의사용법을익혀둘필요가있다. 이번호는 WinDbg 를, 다음호에는 SoftIce 를다루어볼생각이다. 먼저두프로그램의장단점을살펴보면앞서말했듯이 WinDbg 는무료라는이점과함께 MS 에서만들어졌다는장점이있다. OS 를만든 MS 에서직접제공되는디버거로 SoftIce 에비해좀더안정적이다. 단, PC 한대에서돌아가는 SoftIce 와달리디버깅의대상의되는 Target PC 와디버거가돌아갈 Host PC 가따로필요한단점이있다. 이점은뒤에서다시설명하겠다. 1. WinDbg 설치하기 http://www.microsoft.com/whdc/devtools/debugging/default.mspx 위사이트를방문하면, WinDbg 설치파일을구할수있다. 주의할것은설치파일이 WinDbg 로명시되어있지않고, Debugging Tools for Windows 로되어있다는것이다.
그림 1 WinDbg 설치 위의그림은설치파일을실행시켰을때의최초화면이다. Next> 를클릭하면서디폴트로설치하면된다. 2. WinDbg 설정하기 WinDbg 를설치하고, WinDbg 를실행시켜보자.
그림 2 WinDbg 실행하기 그림 3 WinDbg 실행 3. 애플리케이션디버깅하기 WinDbg 사용법에익숙해지기위해서여기서는간단한윈도우애플리케이션을디버깅하도록하자. WinDbg 에서디버깅을수행하기위해서는 pdb 파일이필요하다. 마이크로소프트의 VisualStudio 에서 Debug Build 로빌드를하면, 프로젝트폴더의 Debug
폴더안에 pdb 확장자를갖는파일이생기게된다. 이파일을 WinDbg 의 Symbol File Path 에복사해넣어야한다. 아래그림과같이 [Symbol File Path...] 를클릭하여, 특정폴더를디버깅을위한심볼파일경로로설정한다. 그림 4 애플리케이션디버깅 그림 5 심볼검색경로 여기서는위와같이 C: Symbols 디렉토리를심볼파일경로로설정하였다.
이폴더에디버깅하고자하는애플리케이션의 pdb 파일을복사한후, WinDbg 의 [Open Executable... ] 메뉴를클릭해서, 애플리케이션을연다. 그림 6 디버깅할애플리케이션열기
그림 7 디버깅할애플리케이션열기 그러면, 다음과같이 WinDbg 커맨드창에명령을입력할수있는상태가된다. 그림 8 디버깅할애플리케이션열기
소스레벨로디버깅을하기위해서는소스파일을열어야한다. 다음그림과같이 [Open Source File...] 메뉴를선택하고, 파일을선택한다. 그림 9 소스파일열기 아래와같이소스창을보여주게되는데, VisualStudio 와같이 F9 로브레이크포인트를걸어트레이싱할수있다.
그림 10 소스파일열기 특정라인에브레이크포인트를걸고 F5 를쳐서디버깅을시작하면, 다음그림과같이로컬변수도확인이가능하다.
그림 11 로컬변수확인 이외에도 WinDbg 는커널디버깅도지원하고있으므로, F1 을눌러 Help 파일을보면서익혀나간다면효과적인커널디버깅을할수있을것이다. 단, 커널디버깅을위해서는두대의컴퓨터와시리얼케이블이필요하다. 아래그림은 WinDbg 의 Help 파일내용이다. 그림 12 WinDbg 도움말
4. 커널디버깅을위한 WinDbg 설정커널디버깅용으로 WinDbg 를사용하기위해서는 타겟컴퓨터 (debuggee) 와 호스트컴퓨터 (debugger) 라는용어를이해하고있어야한다. 다음그림은두대의컴퓨터가널모뎀케이블로연결되었을때를보여주는데, 왼쪽컴퓨터가호스트가되고, 오른쪽컴퓨터가타겟이된다. 여기서호스트컴퓨터는널모뎀을통해서원격으로타겟컴퓨터를디버깅하는컴퓨터이다. 이와같이 WinDbg 로커널모드디버깅을하기위해서는두대의컴퓨터를필요로한다. 각컴퓨터의설정에대해서알아보자. 그림 13 호스트와타겟컴퓨터 4.1. 타겟컴퓨터설정하기타겟컴퓨터는 WinDbg 를설치하지않아도된다. 단, 디버그모드로부팅되는것이요구되는데, 그러기위해서 C: boot.ini 를수정해야한다. C: boot.ini 를메모장으로열어보자. 명령프롬프트에서다음명령을실행한다. c: >notepad boot.ini
그림 14 boot.ini 파일변경 처음에는위와같은형태를보일것이다. 여기에다음과같이 /debug 를추가하면디버그모드로부팅할수있다. multi(0)disk(0)rdisk(0)partition(1) WINDOWS="Windows XP for Debug" /fastdetect /debug 두컴퓨터가시리얼로연결되어있으면, 다음과같은줄을추가한다. 한줄임에주의! multi(0)disk(0)rdisk(0)partition(1) WINDOWS="Windows XP for Debug(COM1)" /fastdetect /debug /debugport=com1 /baudrate=115200 커널디버깅을위해 COM1 포트를사용하고, 속도는 115200 을사용한다는것을나타낸다. 다음과같이된다.
그림 15 boot.ini 파일변경 boot.ini 를현재상태에서저장하려하면물론저장이안된다. boot.ini 는시스템용읽기전용파일이기때문이다. 파일속성을다음과같이변경하면된다. c: >attrib -s -h -r boot.ini 저장하고나서, 다시원래의속성으로복귀시켜야하는데다음명령을내린다. c: >attrib +s +h +r boot.ini 이제타겟컴퓨터가디버그모드로부팅할수있도록설정을완료하였다. 4.2 호스트컴퓨터설정하기 WinDbg 를설치하고, WinDbg 를실행시켜보자.
그림 16 WinDbg 실행 그림 17 WinDbg 실행
위와같은창이뜨게되는데, 커널디버깅을위한설정을해야한다. 우선, 타겟컴퓨터의연결방법대로시리얼을사용할것이다. 우선, File->Kenel Debug... 를선택하자. 그림 18 커널디버깅 다음과같은창이뜨면, 호스트컴퓨터가시리얼포트 COM1 을사용하여타겟컴퓨터와연결되었고, 속도는타겟컴퓨터와일치시켜 115200 이되므로다음과같이설정한다.
그림 19 타겟컴퓨터와연결 [ 확인 ] 을클릭하면, 다음그림처럼타겟컴퓨터가디버그모드로부팅되기를기다리게된다. 그림 20 타겟컴퓨터연결을기다림 타겟컴퓨터를재부팅해서, 멀티부팅메뉴중에서 Windows XP for Debug(COM1) 을선택하면, 다음과같이 WinDbg 화면에서타겟컴퓨터가연결된것을표시하게된다.
그림 21 타겟컴퓨터연결 4.3. WinDbg 사용하기타겟컴퓨터가연결된상태에서 Ctrl+Break 버튼을클릭하면, 다음과같이명령을입력할수있는상태로전환된다. 이때타겟컴퓨터는동작이중단된상태이다.
그림 22 타겟컴퓨터중단 kd> g 명령을입력하면, 타겟컴퓨터가다시작동하게된다.
그림 23 타겟컴퓨터작동 드라이버코드에서 DbgPrint() 함수를적절하게배치하면, 위커맨드창에서 DbgPrint 출력을볼수있고, 드라이버동작의흐름을확인할수있다. 5 덤프분석하기 WinDbg의장점을앞서말한바있지만 WinDbg를쓰게되는이유는블루스크린이떴을때메모리덤프분석을위해서이기도하다. 5.1 덤프파일설정하기
그림 24 시스템등록정보고급탭 내컴퓨터 를오른쪽버튼클릭하여팝업메뉴중등록정보를선택하고 고급 탭을누르면위와같이뜬다. 여기서 시작및복구 를선택한다. 디버깅정보쓰기에서메모리덤프의크기를설정할수있다. 전체메모리덤프를선택하면블루스크린당시의유저메모리와커널메모리전체가그대로메모리크기와같은크기로파일이생성된다.
그림 25 덤프분석하기 WinDbg를실행시켜 File 메뉴의 Open Crash Dump 메뉴를선택하여 DMP파일을오픈합니다. Symbol File Path와 Source File Path의설정이제대로되어있는지확인합니다. 특히심볼이많을수록더자세한정보를볼수있으므로웹에서 OS 심볼을다운받을수있도록 SRV*c: websymbols*http://msdl.microsoft.com/download/symbols 처럼추가하고소스가있으면 Source File Path를설정합니다. 위의설정이끝나면, kd>.reload로심볼을로드합니다. Kd>!analyze v를치면, 더자세한디버깅정보를얻을수있습니다.