http://www.cyworld.com/ubiquitouz/3198816


[ 세미나 1탄 ] WinDbg... Part 1.


 

1     WinDbg 개요 및 설치

1.1        WinDbg?
WinDbg
란 윈도우용 디버거입니다. MS에서 무료로 배포하고 있으며과거 SoftICE라는 강력한 디버거가 있었지만 단종된 이후계속해서 발전한 결과 윈도우 환경에서 가장 강력한 디버깅 성능을 제공합니다.
 

1.2       주요 기능으로는 응용프로그램 디버깅(유저모드 디버깅), 커널모드 드라이버 디버깅(커널모드 디버깅), 크래시 덤프 파일 분석윈도우 시스템 분석스크립트와 확장 DLL, 디버깅 도움말 이 있습니다.

1.3       WinDbg 다운로드
 32Bit
   
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
 64Bit
   
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

 

2     라이브 디버깅과 덤프 디버깅

2.1       라이브 디버깅(유저모드 라이브 디버깅커널모드 라이브 디버깅)

2.1.1   직접 작성한 소스코드를 한 줄 한 줄 수행하면서 디버깅

2.1.2   리모트 디버깅

디버깅할 PC에서는 WinDbg만 싱행하고 네트워크상의 PC에서 디버깅할
PC
의 실행 중인 프로세스를 TCP/IP PIPE로 연결해 디버깅

2.1.3   실행중인 운영체제와 커널모드 드라이버 디버깅
한대의 PC에서 할 수 없으므로 WinDbg를 실핼하는 PC와 디버깅 대상이 되는 PC가 필요하다
 참고
가상머신(vmware, vitualbox )으로 마치 한 대릐 PC에서 두 대인 것처럼 디버깅 할 수 있다

2.2       덤프 디버깅

유저모드나 커널모드에서 오류가 발생했을 때 생성되는 메모리 덤프 파일을 분석하면서 디버깅(덤프파일:오류가 발생한 시점의 레지스트콜 스택메모리프로세스스레드 정보 등을 저장)

2.3       유저 덤프와 커널 덤프

2.3.1   유저 덤프 : 유저모드에서 생성된 메모리 덤프

2.3.2   커널 덤프 : 커널 모드에서 생성된 메모리 덤프

 

3     WinDbg 디버깅 용어

3.1        디버거와 디버기

3.1.1   디버거 ; 디버깅하는 도구 (VS2008, WinDbg, gdb )

3.1.2   디버기 : 디버깅을 당하는 대상 (개발 중인 프로그램)

3.2       블루스크린(Blue Screen Of Death)

3.2.1   BSOD는 커널모드에서 문제가 발생했을 때 나타납니다. 윈도우 9x 계열에서는 유저모드에서 문제가 발생하더라도 BSOD가 발생하는 경우가 있었지만 윈도우 NT 계열에서는 설계상 커널모드와 유저모드는 메모리 공간이 명확히 구분되어 있어 유저모드 메모리 영역이 손상되더라도 커널모드 메모리 영역을 손상시키는 것은 불가능하기 때문입니다.

3.2.2   SPCMDCON.SYS로 인해 BSOD가 발생했을 수도 잇다는 정보
(
가끔 엉뚱한 드라이버를 지목하기도 하므로 주의)

3.2.3   PAGE_FAULT_IN_NONPAGEED_AREA는 문제의 종류를 나타내는 문구
페이지 되지 않은 영역에서 페이지 폴트가 발생했음을 의미

3.2.4   0x00000050은 버그체크 번호(Bug Check Code)
PAGE_FAULT_IN_NONPAGEED_AREA 
를 의미

 

 

3.2.5   주의 : Physical memory dump complete 부분이 0 ~ 100 까지 늘어 나는데 그 동안에 시스템을 리붓하면 덤프 파일이 정상적으로 생성되지 않을 수도 있다

3.3       버그체크

3.3.1   BSOD를 띄우기 위해 호출하는 함수는 KeBugCheck()라는 함수가 존재하고이때 나타나는 내용은 버그체크 번호입니다버그체크를 직역하면 버그 확인이라는 의미이며현재 동작 조건이 비정상이라고 커널에서 판단했을 때 호출하는 함수 이름이 KeBugCheck() 입니다. 버그체크 번호마다 세부 내용을 담은 추가적인 파라미터가 다르므로 WinDbg 도움말에서 확인하면 이에 대한 항목을 찾을 수 있습니다.

3.3.2   참고(Bug Check Code)
http://msdn.microsoft.com/en-us/library/ff542347.aspx
또는 WinDbg의 도움팔 색인 검색(: Bug Check 0x50)

3.3.3   디버그 심볼 파일 : 디버그 심볼 파일이란 실행 파일을 빌드할 때 생성되는 디버그용 정보 파일을 말합니다디버그 심볼 파일에 포함되는 디버그 정보란 실행 파일 안에 존재하는 함수나 변수들의 이름과 위치소스 파일소스 라인 정보이며비주얼 스튜디오나 WinDbg 같은 디버거는 이 심볼 파일을 이용하여 소스 라인 디버깅을 가능하게 합니다심볼 파일이 없다면 소스 라인 디버깅이 불가능할 뿐만 아니라 함수 이름이나 변수 이름조차 파악할 수 없습니다

4  VS2008 설정

2.1       프로젝트 메뉴의 속성 선택

2.2       상단 구성(C)을 활성(Release)  활성(Win32) 로 선택

2.3       C/C++ 트리의 디버깅 정보 형식을 프로그램 데이터베이스(/Zi)로 선택

2.4       링커의 디버깅 선택

2.5       디버그 정보 생성을 (/DRBUG)로 설정

2.6       프로그램 데이터베이스 파일 생성을 .Release/MyApp.pdb로 설정

2.7       맵 파일 생성을 (/MAP) 설정

2.8       맵 파일 이름을 ./Release/MyApp.map 로 설정

 

5     유저모드 라이브 디버깅

5.1       첫번째 시나리오 특정 프로세스 라이브 디버깅

5.2       개발시 VS + WinDbg 로 얻을 수 있는 장점

5.2.1   WinDbg의 각종 디버깅 명령을 사용할 수 있다.

l     프로세스스레드 정보모듈 정보버전 정보메모리 등 세세한 디버깅

5.2.2   이미 실행 중인 프로세스에 붙여서 디버깅 가능서비스 디버깅시 유용
(
물론 VS로도 가능하다 하지만 고객PC에 VS를 설치할 수 없지 않은가)

5.2.3   VS같은 개발 툴 없이도 디버깅이 가능하다

5.3       WinDbg 실행

5.3.1    [시작] - [프로그램] - [Debugging Tools for Windows (x86)] - WinDbg를 선택해 실행합니다여기서 주의할 점은 윈도우 비스타이상은 일반 권한으로 실행하면 권한 문제가 발생하기도 하므로 실행할 때 관리자 권한으로 실행오른쪽 마우스 버튼으로 메뉴를 띄워 [관리자 권한으로 실행]으로 실행 또는 [속성 [호환성 [권한수준]에서 관리자 권한으로 이 프로그램 실행 체크

 


 

5.3.2   설치후 실행 경로를 지정했다면 명령 프롬프트 창에서 windbg만 입력헤 실행 할 수도 있다

     

 

5.3.3    WinDbg 실행 초기 화면

 

 

 

5.4       WinDbg 연결

5.4.1   WinDbg에서 프로그램을 실행하면서 연결

5.4.2   이미 프로그램이 실행된 상태에서 WinDbg 연결

5.4.3   프로그램이 먼저 실행된 상태에서 어떤문제가 발생했을 때 자동으로 연결

5.5       WinDbg에서 프로그램 실행하기(디버거에서 디버기 실행하기)

5.5.1   프로그램의 시작점인 main(or winmain)함수부터 디버깅 하려고 할 때 사용
비쥬얼 스튜디오에서 코드를 작성하고 F5를 눌러 디버깅하는 것과 비슷

5.5.2   [File]  [Open Executable] 선택

5.5.3   파일 이름을 선택하고 [열기] 클릭

    자신의 프로그램이 명령 인자를 받는다면 하단에 보이는 [Aguments]에 명령인자를 입력하고 [열기]클릭

5.5.4   프로세스 초기화가 끝나고 main()함수 진입하기 전에 한번 멈춘다.

 

 

5.5.5   g 를 누르거나 F5 키를 누르면 main() 함수로 진입하면서 프로그램 실행

    main()함수부터 디버깅을 하려면 이 시점에 main()함수에 브레이크포인트를 걸어주고 g 명령 수행

5.6       실행 중인 프로그램에 WinDbg 붙이기(디버거를 디버기에 붙이기)

5.6.1   이미 실행 중인 응용프로그램을 디버깅 할 때 붙이기(Attach)기능 사용

5.6.2   주로 특별한 조건으로 실행된 상태의 응용프로그램을 디버깅하거나 서비스 프로세스를 디버깅할 때 사용

    다른 응용프로그램에 의해서 실행되어야 하는 종류나 명령 인자를 동적으로 생성하는 종류의 응용프로그램으로 고정된 인자를 주기 어려운 프로그램을 디버깅 할 때 유용

5.6.3   [File]  [Attach to Process] 선택(단축키 F6)

 

 

5.6.4   현재 실행중인 프로세스 목록에서 디버기를 선택하고 [OK] 선택

    WinDbg를 종료하면 실행 중이던 프로그램도 함께 종료 되므로 주의
종료되지 않게 하려면 아래 부분의 Noninvasive 사용
하지만 프로세스를 멈추게 하거나 동작을 바꾸거나 하는 제어는 할 수 없다. XP 이후부터는 Noninvasive 모드를 사용하지 않아도 qd(Quit and Detach) 명령을 이용하여 프로세스를 종료하지 않고 디버거를 프로세스로부터 떼어낼 수 있다

 

 

 

5.6.5   WinDbg에서 프로그램 실행하기 와 비슷하지만 main()함수는 이미 수행되어 지나가 버린 상태이고어떤 코드를 수행하다가 중지된 것인지 알 수 없는 상황앞으로 수행될 것으로 예상되는 함수에 브레이크포인트를 걸면서 디버깅을 시작해야 하는데심볼을 먼저 맞춰줘야 추가 작업을 진행 할 수 있다.

5.7       프로그램 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기

5.7.1   프로그램에 어떤 문제가 발생했을 때 항상 WinDbg를 자동으로 싱행해 디버깅을 진행하려고 할 때 사용하는 방법

5.7.2   이 기능은 레지스트리에 존재하는 AeDebug 키를 이용하는 방법으로 이 기능을 설정하려면 명령 프롬프트에서 WinDbg를 실행할 때 다음과 같이 옵션을 사용

    윈도우 7에서는 반드시 관리자 권한으로 명령프롬프트를 실행

5.7.3   HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 레지스트리에 WinDbg가 등록되어 어떤 프로세스에 문제가 발생했을 때 자동으로 실행

 

5.7.4   주로 불특정하고 오랜 기다름 끝에 오류가 발생하는 종류의 문제를 해결할 때 사용됩니다

5.8       심볼 파일 로드 (운영체제 심볼 파일과 모듈의 심볼 파일)

5.8.1   운영체제 심볼 경로 설정과 로드

5.8.1.1   마이크로소프트는 모든 운영체제의 심볼 파일을 웹 심볼이라는 형태로 제공하며 웹 심볼의 URL을 심볼 파일 경로에 등록해 주면 자기 자신의 운영체제에 맞는 심볼을 자동으로 다운 받을 수 있다

5.8.1.2   SRV*E:\OsSymbols*http://msdl.microsoft.com/download/symbols
SRV
는 심볼 서버를 사용한다는 의미
C:\OsSymbols
는 다운로드 받은 심볼 파일을 저장해 놓을 경로
http://msdl.microsoft.com/download/symbols
는 웹 심볼 서버의 URL

5.8.1.3   [File] 메뉴에서 [Symbol File Path]를 선택합니다.(단축키 : Ctrl + S)

5.8.1.4   URL을 넣은 후 [Reload] 체크하고 [Ok]를 누르면 현재 WinDbg가 정보를 보여줘야 하는 모듈이 있다면 그에 대한 심볼 파일만 다운로드 합니다.

 

 

5.8.1.5    .symfix라는 간단한 명령을 사용해 웹 심볼을 설정할 수도 있다.
명령 창에 .symfix 명령을 사용하고 뒤에 심볼 파일 다운로드 경로만 입력


5.8.2   프로그램 심볼 경로 설정과 로드

5.8.2.1   프로그램이 빌드 될 때 함께 생성된 심볼 파일 MyApp.pdb의 위치를 심볼 경로에 추가

5.8.2.2   심볼 경로는 빌드가 완료되면 심볼 파일이 생성되는 위치를 사용해도 되지만 WinDbg가 심볼 파일을 로드하고 있을 때 다시 빌드를 수행한다면 로드된 심볼 파일은 WinDbg가 로드하고 있으므로 새로운 심볼 파일이 생기지 않습니다. 따라서 심볼 파일들만 모아두는 별도의 장소를 마련해 놓는 것이 좋다.

5.8.2.3    심볼 경로에 포함하려면 [File] - [Symbol File Path] 선택

5.8.2.4   세미콜론을 사용해 얼마든지 경로를 추가할 수 있다. [Reload]를 체크하고 [OK] 버튼을 누르면 설정이 완료되고 필요한 심볼을 로드

5.8.2.5   .sympath 명령은 파라미터 없이 사용하면 .sympath 명령어만 적어주면 되고, 위에서 OS 심볼 Path를 입력했기 때문에 .sympath 뒤에 +를 붙여 경로를 추가

5.8.3   심볼 스토어 생성

5.8.3.1   심볼 스토어(Symbol Store)란 모든 심볼 파일을 모아 놓고 해당 위치를 심볼 경로로 지정하면 디버깅하는 모듈의 심볼 파일이 저절로 찾아져서 매번 심볼 파일을 찾고 복사하는 작업을 할 필요가 없다

5.8.3.2   E:\MySymbols 에 매번 빌드한 심볼 파일을 심볼 스토어 형식으로 더하면 E:\MySymbols 에는 내가 개발하는 모듈의 모든 버전에 대한 심볼 파일들이 체크섬에 따라 분류되어 쌓이게 된다. 새로 빌드한 심볼 파일의 복사가 실패하지도 않고 과거 버전의 심볼 파일들도 유지되므로 과거 버전의 디버깅도 가능

5.8.3.3   AddMySym.bat 배치 파일을 만들고 내용은 아래와 같이 작성하자
Symstore add /f %1 /s E:\MySymbols /t MyProduct

5.8.3.4   사용법은 추가할 심볼파일의 경로와 파일명을 붙여서 인자로 실행

5.8.3.5   편하게 사용하려면 바탕화면에 복사하거나 단축아이콘을 만들어 심볼파일을 Drag&Drop
WinDbg
에서 사용할 때는 심볼경로에 E:\MySymbols 추가

 

5.8.3.6 네트워크 폴더를 심볼 스토어로 사용하면 팀 프로젝트의 생산성을 더욱 향상시킬 수 있다

 

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

참고 도서

: WinDbg로 쉽게 배우는 Windows Debugging. 에이콘. 김성현, 이태화, 김희준 지음

참고 사이트

http://greemate.tistory.com/

  http://jokerman.tistory.com/

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

 

반응형

+ Recent posts