'디버깅 & 스킬 > WinDbg 사용법' 카테고리의 다른 글
!analyze -v 명령 (0) | 2012.12.23 |
---|---|
비주얼스튜디오 스타일로 꾸민 windbg UI (0) | 2012.12.14 |
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
WinDbg 명령어들 (0) | 2012.12.09 |
!analyze -v 명령 (0) | 2012.12.23 |
---|---|
비주얼스튜디오 스타일로 꾸민 windbg UI (0) | 2012.12.14 |
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
WinDbg 명령어들 (0) | 2012.12.09 |
windbg 에서 !analyze -v 이러한 명령을 치면
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
p.s 헐...
http://rein.kr/blog/archives/2528
당연한 얘기지만, 그 만큼의 수고와 끊임 없는 개선이 따랐기 때문. 이미 10년이 넘은 이 툴은…
WER 팀의 작년 논문(작년 10월의 SOSP09,http://www.sigops.org/sosp/sosp09/papers/glerum-sosp09.pdf)에 따르면,
!analyze is roughly 100,000 lines of code implementing some 500 bucketing heuristics, with roughly one heuristic added per week.
!analyze 명령 (WinDbg)는 대략 십만 줄의 코드로 만들어져 있고, 이는 500 개의 버킷팅 휴리스틱을 구현한다. 그리고 개략적으로 매주 1개의 휴리스틱이 추가된다.
라 한다.[1]
프로그래머가 직접 실행하기도 하는 부분이지만(windbg !analyze), 이 부분은 WER 서비스의 백엔드 서버들도 수행하는 부분이다. 그리고 이 부분에서 계속적으로 사용되고, 결과를 측정하고(!), 이를 반영해서 새로운 휴리스틱을 적용하는 등의 개선이 있었기에 굉장히 훌륭한 디버깅 툴이 된 것.
PS. 저 논문 굉장히 재밌다. 세부 내용 말고도 WER 서비스의 개략적인 역사와 통계, 측정치만 봐도 개발자들은 매우 재밌게 볼 수 있음.
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License.
windbg 워크스페이스 두번째 스타일 (0) | 2013.06.06 |
---|---|
비주얼스튜디오 스타일로 꾸민 windbg UI (0) | 2012.12.14 |
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
WinDbg 명령어들 (0) | 2012.12.09 |
3D그래픽스 물리 수학, 프로그래밍 GPU Shader 게임엔진 알고리즘 디자인패턴 matlab etc..
이건 지극히 나의 개인적 visual studio UI 스타일이라 딱히 광범위한 스타일이라곤 하긴 어렵지만
응용프로그램에 대한 유저디버깅을 위주로 하는 사람에게는 유용할것으로 생각한다.
워크스페이스를 작성했던 windbg 버전은 6. 버전계열이다
windbg 워크스페이스 두번째 스타일 (0) | 2013.06.06 |
---|---|
!analyze -v 명령 (0) | 2012.12.23 |
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
WinDbg 명령어들 (0) | 2012.12.09 |
http://cafe.naver.com/totallab/447
심볼 로드까지 완료하고 준비가 됐으면 프로그램을 실제로 실행합니다. WinDbg에서 멈춰있던 프로그램을 실행하는 세 가지 방법이 있습니다.
① 명령 창에서 g 명령을 수행
② F5 키를 누름
③ 메인 UI의 툴바에서 Go 버튼을 누름
위 세 가지 방법 중 아무거나 사용해도 수행 결과는 아래와 같습니다.
명령줄은 프로그램이 실행 중이므로 ‘*BUSY* Debuggee is running…’을 표시하면서 입력을 받아들이지 않는 상태가 됩니다.
이 상태에서 프로그램을 WinDbg로 제어 하려면 프로그램을 멈춰야 합니다. 멈추기 위해서는 두 가지 방법이 있습니다.
① Ctrl + Break 키를 누름
② 메인 UI의 툴바에서 브레이크(Break) 버튼을 누름
위 두 가지 방법 중 아무거나 사용해도 수행 결과는 아래와 같습니다.
‘Break instruct exception’이 표시되면서 현재 레지스터 상태를 표시하고 멈춥니다. 프로그램은 멈춰있는 상태이고 명령줄이 활성화되어 각종 제어 명령을 사용할 수 있습니다.
!analyze -v 명령 (0) | 2012.12.23 |
---|---|
비주얼스튜디오 스타일로 꾸민 windbg UI (0) | 2012.12.14 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
WinDbg 명령어들 (0) | 2012.12.09 |
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
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
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를 실행할 때 다음과 같이 –I 옵션을 사용
★ 윈도우 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/
======================================================================================================================
비주얼스튜디오 스타일로 꾸민 windbg UI (0) | 2012.12.14 |
---|---|
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
WinDbg 명령어들 (0) | 2012.12.09 |
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
http://darpangs.tistory.com/entry/WinDbg-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC-1
간단하게 내가 자주 사용하는 명령어들을 정리해보았다.
WinDbg 에는 3 종류의 명령어가 있다.
구분 | 명령어 | 설명 | 예제 |
도움말 보기 | .hh | 도움말을 연다. | .hh .reload // .reload 명령어에 관한 도움말을 열어본다
|
경로 설정 | .sympath | 디버깅 심벌 위치 디렉토리 설정 | .sympath+ d:\work\bin |
.srcpath | 소스 파일 위치 디렉토리 설정 | .srcpath+ d:\work\src | |
.symfix | 웹 디버깅 심벌 서버 설정. | .symfix+ c:\symbols | |
디버깅 심벌 로딩하기 | .reload | 디버깅 심벌을 로드한다. ( 이 명령어는 디버깅 심벌을 준비해놓는다고 보면 될거 같다. 기본적으로 WinDbg 는 deferred symbol loading 을 수행하는데, 당장 쓰이지 않으면 디버깅 심벌을 로딩해 놓지 않는다. ) 주의사항은 확장자를 붙여야 한다는것. | .reload darpangs.sys // 디버깅 심벌 로드
.reload /u darpangs.sys // 디버깅 심벌 언로드
.reload /i darpangs.sys // 디버깅 심벌 강제 로드 |
ld | 디버깅 심벌을 로드한다. ( deferred loading 된 디버깅 심벌들을 실제로 로딩한다. ) 주의사항은 확장자 없이 사용한다는 것 | ld darpangs | |
로딩된 모듈 및 디버깅 심벌 보기 | lm | List Loaded Modules 현재 로딩 되어 있는 모듈들을 본다. | lmm *darpangs* // darpangs 글자가 들어간 모듈 나열
lmv // 상세 정보 표시
lml // 디버깅 심벌이 로딩된 모듈만 표시. |
쓰레드 보기 | ~ | 쓰레드 정보를 본다. | ~* // 모든 쓰레드를 표시한다.
~5 // 5번 쓰레드를 표시한다.
~1s // 1번 쓰레드를 현재 쓰레드로 설정한다.
~# // 예외를 일으킨 쓰레드를 본다. |
스택 보기 | k | 현재 쓰레드의 스택을 본다. | kb // 스택 상황을 파라미터와 함께 본다.
kn // 스택 프레임 번호를 함께 본다.
kf // 스택 프레임 간격을 함께 본다. 이 기능은 로컬 스택의 크기를 알 수 있다. |
심벌 보기 | x | 특정 모듈의 심벌을 본다. | x ntdll!*create* // ntdll 의 심벌(변수나 함수)중 create 이라는 단어가 들어간 것을 표시한다. |
자료 구조 보기 | dt | 데이터 타잎을 본다. 디버깅 심벌이 로딩되어 있을 경우, 구조체의 정보를 보여준다. | dt ntdll!*list* // ntdll 의 구조체 중 list 단어가 들어간 것을 모두 보여준다.
dt ntdll!_LIST_ENTRY // ntdll 의 구조체 중 _LIST_ENTRY 구조체의 구성을 보여준다.
dt ntdll!_LIST_ENTRY 0x12345678 // 0x12345678 메모리의 데이터를 _LIST_ENTRY 구조체로 맞추어서 보여준다.
dt ntdll!_LIST_ENTRY 0x12345678 –r2 // 구조체 내부에 또 다른 구조체가 있을 경우, 해당 구조체의 내용도 표시해준다. 2단계까지 내용을 표시한다. |
메모리 보기 | d | 메모리의 값을 각 형태에 맞게 본다. | |
dd | dd 0x12345678 // 0x12345678 메모리의 데이터를 Double Word 형태로 출력한다. | ||
db | db 0x12345678 // 0x12345687 메모리의 데이터를 Byte 단위 및 ASCII 문자 형태로 출력한다. | ||
du | du 0x12345678 // 유니코드 형태로 출력한다. | ||
브레이브 포인트 | bp | 브레이크 포인트 설정 | bp ntdll!NtCreateFile // ntdll.dll 의 NtCreateFile 함수에 브레이크 포인트를 건다. |
bu | 브레이크 포인트 설정 ( 심벌 이름으로 ) | bu ntdll!NtCreateFile // ntdll.dll 의 NtCreateFile 함수에 브레이크 포인트를 건다. 아직 로딩되지 않은 모듈에 브레이크 포인트를 설정할 수 있으며, 모듈이 언로드 되거나 WinDbg 가 종료되더라도 브레이크 포인트 설정이 계속 유지된다. | |
bl | 브레이크 포인트 리스트 보기 | bl | |
bc | 브레이크 포인트 모두 제거 | bc | |
bd | 브레이크 포인트 비활성화 | bd 5 // 5번 브레이크 포인트 비활성화 | |
be | 브레이크 포인트 활성화 | be 1-4 // 1번부터 4번까지의 브레이크 포인트 활성화 | |
ba | 메모리 브레이크 포인트 설정 | ba w4 0x12345678 // 0x12345678 주소가 Writing 되는 시점에 브레이크가 걸린다.
ba r4 0x12345678 // 0x12345678 주소가 Reading 되는 시점에 브레이크가 걸린다. | |
브레이크 실행 제어
( .hh Controlling the Target ) | F9 키 ( bp ) | 현재 src 창이나 disassembly 창의 라인에 브레이크 포인트 설정 | Visual Studio 와 동일 |
F10 키 ( p ) | src 나 disassembly 의 한라인 실행 | Visual Studio 와 동일 | |
F11 키 ( t ) | 함수호출 시, 함수 내부 추적. | Visual Studio 와 동일 | |
Shift + F11 키 ( gu ) | 현재 함수 종료까지 실행 | Visual Studio 와 동일 | |
오류 분석 | !analyze | 현재 예외 상황의 원인을 분석한다. | !analyze -v |
[WinDbg] 6. 실행과 정지 (0) | 2012.12.14 |
---|---|
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
winDbg 를 기본 디버거로 설정 (0) | 2012.12.06 |
[ 세미나 1탄 ] WinDbg... Part 1. (0) | 2012.12.12 |
---|---|
WinDbg 명령어들 (0) | 2012.12.09 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
winDbg 를 기본 디버거로 설정 (0) | 2012.12.06 |
WinDbg 3가지 연결방법 (0) | 2012.12.05 |
WinDbg 공부하면서 요약한 내용을 정리한 것인데… 하다보면 느끼는데… 이런거 정리할 시간에 글자 하나라도 더 보는게 좋은거 같다.. ^^;
WinDbg로 쉽게 배우는 Windows Debugging (요약) - 에어컨 / 김성현, 이태화, 김희준 지음 -
1장. WinDbg에 대해
WinDbg 디버깅 종류
메모리 덤프 파일 응용프로그램에 문제가 발생할 때 상태가 저장된 파일, 오류가 발생했을 시점의 레지스터, 콜스택, 메모리, 프로세스, 스레드 정보 등이 저장되며 문제가 발생한 마지막 순간의 상태를 보존한다.
설정에 따른 메모리 덤프 (예) 메모리(1GB) ㅇ 전체 메모리 덤프 => C:\Windows\MEMORY.dmp(1GB) ㅇ 커널 메모리 덤프 => C:\Windows\MEMORY.dmp(300MB) ㅇ 작은 메모리 덤프 => C:\Windows\Minidump\Mini022908-01.dmp(64KB)
유저모드 vs 커널모드 가상 메모리 공강
블루스크린 (BSOD) – Blue Screen of Death BSOD는 커널모드에서 문제가 발생했을 때 나타난다. BSOD가 발생했을 때 가장 먼저 생각하는 것이 "최근에 새로 설치한 하드웨어가 무엇이었는가"이며, 새로 설치한 하드웨어가 없다면 새로 설치한 프로그램이 무엇인가를 살펴본다. 커널모드 드라이버를 포함하는 프로그램일 수 있기 때문이다.
커널모드가 유저모드 디버깅과 다른점은 디버거가 하나의 드라이버에 연결돼 디버깅하는 것이 아니라 운영체제 자체에 연결돼 커널모드 전체를 디버깅한다
라이브 디버깅 vs 덤프 디버깅 라이브 디버깅이란 프로그램 동작 중 디버깅을 하는 것, 직접 작성한 소스코드를 한줄한줄 수행하면서 디버깅하는 경우, 이미 작성된 프로그램의 버그를 확인하는 경우
포스트모텀 디버깅(PostMortem Debugging) 라이브 디버깅을 통해 문제를 해결하는 것이 아니라 문제가 발생한 순간이나 특정한 상황을 덤프 파일과 같은 스냅샷으로 생성하고 추후에 그것을 분석해 문제를 해결하는 과정
디버그 심볼 파일 (.pdb) 디버그 심볼 파일이란 실행 파일을 빌드할 때 생성되는 디버그용 정보 파일로 포함되는 디버그 정보는 실행 파일안에 존재하는 함수나 변수들의 이름과 위치, 소스파일, 소스 라인 정보이다. 심볼 파일이 없다면 소스 라인 디버깅이 불가능할 뿐만 아니라 함수나 변수 이름조차 파악이 어렵다.
윈도우 OS 버전별 정보 [그림 1-1] 윈도우 OS 버전 순서
WinDbg 명령
드라이버(Driver) 드라이버는 커널모드 드라이버나 장치 드라이버를 줄여서 사용하는 용어로 장치를 운전(동작)해주는 소프트웨어 프로그램을 의미한다. 2장. WinDbg 시작
유저모드 라이브 디버깅 특정 프로세스를 라이브 디버깅(Live Debugging)하는 것은 소프트웨어를 개발할 때 비주얼 스튜디오를 사용해서 디버깅하는 것과 같은 개념이다.
디버거 연결
심볼 파일 로드 로드해야 하는 심볼 파일은 크게 운영체제 심볼 파일과 디버깅하려는 모듈의 심볼 파일
1) 운영체제 심볼(웹 심볼) File 메뉴 → Symbol File Path… 에서 심볼 경로 추가 SRV*D:\MySymbols*http://msdl.microsoft.com/download/symbols
위에 보다 더 간단한 방법으로 명령창에서 아래 명령어 입력하면 자동 0:000> .sysmfix D:\MySymbols 0:000> .reload
2) 모듈 심볼 파일 File 메뉴 → Symbol File Path… 에서 심볼 경로 추가 (마지막에 ; 하고 추가하면 됨) SRV*D:\OsSymbols*http://msdl.microsoft.com/download/symbols;D:\MySymbols
명령창 입력 방법 0:000> .sympath 0:000> .sympath+ D:\MySymbols
실행 : g / F5 정지 : Ctrl + break
MyApp.exe 에 MyApp!CMyAppDlg::OnBreakPoint() 함수에 브레이크 포인트 설정하기 브레이크 포인트 설정> bp MyApp!CMyAppDlg::OnBreakPoint 브레이크 포인트 확인> bl
0번 브레이크 포인트 disable> bd 0 0번 브레이크 포인트 enable> be 0
브레이크 포인트 해제(Breakpoint Clear) > bc 0 > bc * > bc 3-5 > bc 2,7,8
콜 스택 확인 어떤 함수들이 어떤 순서로 해당 함수를 호출했는지 확인하는 것
3장. WinDbg로 디버깅하기
디버거를 붙여놓지 않은 상황에서 응용프로그램이 갑자기 종료하거나 시스템이 재부팅될 때 디버거가 붙어있지 않았다면 윈도우는 크래시 덤프(Crash Dump) = 메모리 덤프 파일을 만들어 놓는다.
유저모드 덤프 디버깅
콜 스택 확인 – 문제가 발생한 흐름 파악
커널모드 덤프 디버깅
> .trap 0xfffffffff7ae7c64 // 트랩 프레임 보기 > k // 문제가 발생했을 당시의 콜 스택 보기
MyDrv의 시작주소와 끝주소, 실행위치, 파일이름, 만들어진 날짜/시간 확인
맨 마지막(제일 윗부분)에 호출된 부분들이 자신이 작성한(MyDrv) 모듈인 경우 여기가 문제가 발생한 곳이라 인정하면 된다.
★ 콜 스택을 보면서 분석을 시작하는 것이 중요!
|
WinDbg 명령어들 (0) | 2012.12.09 |
---|---|
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
winDbg 를 기본 디버거로 설정 (0) | 2012.12.06 |
WinDbg 3가지 연결방법 (0) | 2012.12.05 |
WinDbg를 올디처럼 쓰고싶을때 (0) | 2012.11.19 |
http://www.cyworld.com/vcreator/9549793
X
> windbg는 개별적으로 다운받아서 설치해야 하는 것으로 알고 있습니다.
Download url
http://msdn.microsoft.com/ko-kr/windows/hardware/gg463009
> 원래 다운이 되야 하는데 Download page가 삭제된건지... 다운이 안되네요.
windbg 관련해선 실습겸 추후에 따로 포스팅 하겠습니다.
O
> windbg 설치 -> windbg 설치 경로 환경변수로 추가 -> cmd 에서 windb -l
windbg를 기본 디버거로 설정할 수 있습니다.
> 설정 완료 후 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug"
에서 설정 내용 확인 가능합니다.
WinDbg 명령어들 (0) | 2012.12.09 |
---|---|
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
WinDbg 3가지 연결방법 (0) | 2012.12.05 |
WinDbg를 올디처럼 쓰고싶을때 (0) | 2012.11.19 |
http://cafe.naver.com/totallab/442
WinDbg(디버거)를 프로그램(디버기)에 연결하는 방법은 세 가지가 있습니다.
- WinDbg에서 프로그램을 실행하면서 연결하는 방법
- 이미 프로그램이 실행된 상태에서 WinDbg를 나중에 연결하는 방법
- 프로그램이 먼저 실행된 상태에서 어떤 문제가 발생했을 때 자동으로 WinDbg가 연결되는 방법
1) WinDbg에서 프로그램을 실행하기
<?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o /><?xml:namespace prefix = o />
프로그램의 시작점인 main함수부터 디버깅을 하려고 할 때 사용됩니다. (예 : 비주얼 스튜디오에서 코드를 작성하고F5 키를 눌러 실행하면서 디버깅하는 것과 비슷함)
[File] 메뉴에서 [Open Executable]을 선택합니다.
프로그램이 존재하는 위치를 찾아가서 파일 이름을 선택하고 [열기]를 누릅니다. 자신의 프로그램이 명령 인자를 받는다면 하단에 보이는 [Arguments]에 명령 인자를 입력하고 [열기]를 누릅니다. [열기]를 누르면 프로세스 초기화가 끝나고 아래 그림처럼 main 함수에 진입하기 전에 멈추게 됩니다.
여기서 g 키를 누르거나 F5 키를 누르면 main() 함수로 진입하면서 프로그램이 실행됩니다. Main() 함수부터 디버깅을 하려면 이 시점에 main() 함수에 브레이크 포인트를 걸어주고 g 명령을 수행해야 합니다.
2) 실행 중인 프로그램에 WinDbg 붙이기
이미 실행 중인 응용프로그램을 디버깅하려고 할 때는 붙이기(Attach) 기능을 제공 합니다. 주로 다른 응용프로그램에 의해 실행되어야 하는 종류나 명령 인자를 동적으로 생성하는 종류의 응용프로그램이나 운영중인 서비스 프로세스를 디버깅해야 할 때 사용합니다. 이런 경우 응용프로그램이나 서비스를 실행시킨 다음 WinDbg를 붙이기해 디버깅할 수 있습니다.
WinDbg의 [File] 메뉴에서 [Attach to a Process]를 선택합니다.(단축키 : F6)
현재 실행 중인 프로세스 목록에서 디버기를 선택하고 [OK]를 누릅니다. 주의할 점은 WinDbg를 종료하면 실행 중이던 프로그램도 함께 종료된다는 사실입니다. 기본적으로 디버깅을 하려고 디버거를 붙이는 것은 자유롭게 가능하지만 디버거를 떼어내는 것은 자유롭지 못하다는 의미입니다.
실행 중이던 응용프로그램이 종료되지 않게 하려면 아래 부분의 Noninvasive 옵션을 사용합니다. 단 [Noninvasive] 옵션을 체크하면 WinDbg가 프로그램에 붙기는 하지만 프로세스를 멈추거나 동작을 바꾸거나 하는 제어는 할 수 없으며, 단지 프로세스 내부의 어떤 정보나 특정 메모리를 확인할 수밖에 없지만 WinDbg를 종료해도 프로세스는 계속 실행됩니다.
Noninvasive 모드는 절대 종료하면 안 되는 프로세스를 디버깅해야 하는 경우 프로세스 내부 정보를 확인할 수 있으므로 디버깅에 필요한 정보를 안전하게 얻을 수 있습니다. 개발 중인 프로그램에는 이런 기능이 필요 없겠지만 운영 중인 주요 서비스 프로그램을 디버깅해야 하는 상황이라면 이런 방법으로 해결할 수 있습니다.
윈도우 XP 이후부터는 Noninvasive 모드를 사용하지 않아도 qd(Quit and Detach) 명령을 이용하여 프로세스를 종료하지 않고 디버거를 프로세스로부터 떼어낼 수 있습니다. qd 명령어를 사용하면 디버깅에 아무 제약도 없으면서 WinDbg를 종료해도 프로세스는 종료되지 않는다는 장점이 있습니다. 주의하실 점은 종료하기 전에 qd 명령어를 치지 않으면 같이 종료되어 버리기 때문에 꼭 잊어버리시면 안됩니다.
프로세스 목록에서 디버기를 선택하면 프로그램을 중단시키고 디버거에게 제어를 넘겨줍니다. 멈춰진 화면은 ‘1)WinDbg에서 프로그램 실행하기’ 와 비슷하지만 main()함수는 이미 수행되어 지나가 버린 상태이고, 어떤 코드를 수행하다가 중지된 것인지 알 수 없는 상황입니다. 따라서 앞으로 수행될 것으로 예상되는 함수에 브레이크 포인트를 걸면서 디버깅을 시작해야 하는데, 심볼을 먼저 맞춰줘야 추가 작업을 진행할 수 있습니다. 이에 관련된 내용은 차후에 자세히 다루도록 하겠습니다.
3) 프로그램 실행 중 문제가 발생했을 때 자동으로 WinDbg 실행하기
이 방법은 사용자가 직접 연결하는 방법은 아닙니다. 이 기능은 레지스트리에 존재하는 AeDebug 키를 이용하는 방법으로 이 기능을 설정하려면 명령 프롬프트에서 WinDbg를 실행할 때 다음과 같이 –I 옵션을 사용합니다.
※ 윈도우 7에서는 명령프롬프트를 관리자 권한으로 실행하여야 합니다.
그러면 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug 레지스트리에WinDbg가 등록되어 어떤 프로세스에 문제가 발생했을 때 자동으로 실행됩니다.
이 방법은 주로 불특정하고 오랜 기다름 끝에 오류가 발생하는 종류의 문제를 해결할 때 사용됩니다. 오류가 발생한 순간WinDbg가 자동으로 붙여지게 설정해 놓으면 여유 있게 디버깅의 순간을 기다릴 수 있을 것입니다.
=========================================================================
3) 번 실행 후 갑자기 에러가 나네요... 해결방안을 찾을 때까지 윈도우 7에서는 시도하지 않는 것이 좋을듯 싶습니다. 에러창을 끄고 그냥 사용하면 되지만 잠시 보류하시기 바랍니다.
WinDbg 명령어들 (0) | 2012.12.09 |
---|---|
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
winDbg 를 기본 디버거로 설정 (0) | 2012.12.06 |
WinDbg를 올디처럼 쓰고싶을때 (0) | 2012.11.19 |
WinDbg 명령어들 (0) | 2012.12.09 |
---|---|
Unable to verify checksum for ... 워닝 (0) | 2012.12.08 |
WinDbg 사용법, [마이크로소프트 심볼로드 주소] (0) | 2012.12.08 |
winDbg 를 기본 디버거로 설정 (0) | 2012.12.06 |
WinDbg 3가지 연결방법 (0) | 2012.12.05 |