WinDbg 명령어
WinDbg 에는 3 종류의 명령어가 있다.
- 일반 명령 : 일반적으로 사용하는 디버깅에 관련된 명령어 들이다. 브레이크 설정(bp), 타겟 제어(p,g) 등등
- 메타 명령 : 디버거에 관련된 명령이다. 명령어 앞에 . 이 붙는다. 디버깅 심벌 경로 설정 (.sympath ), 모듈 심벌 로드 (.reload ) 등등
- 확장 명령 : 외부 dll 로 제작된 명령이다(일종의 플러그인 ). 명령어 앞에 ! 이 붙는다. 예외상황분석( !analyze –v ) , 프로세스 구조체 보기 ( !peb ) 등등
구 분 | 명 령 어 | 설 명 | 예 제 |
도움말 보기 | .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 | type을 표시(구조체 등) type에 해당하는 메모리값 확인 디버깅 심벌이 로딩되어 있을 경우, 구조체의 정보를 보여준다. | 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 | double word단위로 메모리를 표시 | dd 0x12345678 // 0x12345678 메모리의 데이터를 Double Word 형태로 출력한다. | |
db | byte 단위로 메모리를 표시 | 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 |