WinDBG Dump 파일 디버깅 (유저 모드 덤프 디버깅)
실행 중인 프로세스를 WinDbg로 디버깅
Visaul studio 의 디버깅과 동일함
솔직히 그냥 Visual studio 로 보는 게 편함
Dump 파일 WinDbg 연결 방법
1. Open Crash Dump
= WinDbg 상단 메뉴의 File > Open Crash Dump
2. Drag and Drop
WinDbg 로 덤프 파일 open 후 확인해야 할 사항
1. 덤프 파일 종류
[전체 덤프]
User Mini Dump File with Full Memory
응용프로그램이 사용하던 모든 메모리가 유효
[미니 덤프]
User Mini Dump File
레지스터, 스택, 메모리 포인터만 유효
2. 운영제체 종류
3. Process Uptime
프로세스 실행 후 얼마나 오랫동안 동작하고 있었나.
해당 시간으로 프로세스에 오류 발생 시간을 유추할 수 있음
명령어
명령어 |
설명 |
.symfix 경로 |
심볼 파일을 받아옴 microsoft url은 을 입력하지 않아도 알아서 받아옴 저장할 경로만 넣어주거나 뒤에 url 추가해주면 받아옴 |
.sympath |
현재 적용되어 있는 심볼 경로를 보여줌 |
.sympath+ 경로 |
심볼 경로 추가 |
.srcpath |
현재 적용되어 있는 소스코드 경로를 보여줌 |
.srcpath+ E:\MySymbols |
cpp 와 같은 pdb에 해당하는 소스코드 경로를 넣어줌 해당 설정이 되어있어야 call stack 하고 소스 위치를 클릭했을 때 소스 파일의 오류 위치가 보임 |
.reload /i |
lm 조회 시 pdb 가 연결이 안 되어있다면 해당 명령으로 버전 상관없이 강제로 붙게 함 |
!analyze -v |
WinDbg 외부 plugin 명령으로 문제를 자동으로 파악하고 보여줌 |
.ecxcr |
예외 정보에 접근 어떤 프로세스에 예기치 않은 오류가 발생하면 덤프 파일에는 예외에 대한 정보가 저장됨 해당 명령으로 예외가 발생한 당시의 상태로 돌려놓고 분석을 할 수 있게 함 해당 명령 수행 후 콜 스택과 레지스터 정보를 분석해야 함 (명령어 : K) |
lmvm 모듈이름 (lm) |
특정 모듈 정보를 확인할 때 사용 해당 모듈의 정확한 소스코드와 심벌을 찾기 위함 명령 수행 후 심볼이 로드됐는지 안됐는지 확인이 가능함 상단에 로드됨 : (no symbols) 로드 안됨 : (private pdb symbols 경로) |
K |
call stack 보기 콜 스택의 경우 가장 윗부분이 마지막에 호출된 부분임 함수 부분 더블클릭하면 소스 창이 열리는데 안 열린다면. srcpath+ 명령으로 소스 경로를 명시해줘야 함 |
~*kvn |
~*k = 모든 Threads의 정보를 보여줌 v = 함수 인자 값 3개를 보여줌 n = 번호를 붙여서 보여줌 |
da 주소 |
주소에 해당하는 String 문자열을 보여줌 da의 경우 유니코드 문자열을 사용할 시 정상적으로 출력이 안됨 |
du 주소 |
주소에 해당하는 유니코드 문자열을 보여줌 |
dt 구조체 이름 주소 |
구조체 이름에 따라 데이터를 보여줌 구조체 이름을 알아야 함 이름 아는 방법은 본인이 개발한 제품이거나 opensource 정보를 보고 파악해야 함 |
dv |
지역 변수 확인 |
db |
전역 변수 확인 |
u 함수 이름 or 주소 |
해당 부분의 어셈블리 코드를 보여줌 |
r |
dump를 생성한 시점의 레지스터 상태를 보여줌 |
유저 모드 덤프 디버깅 방법 1.
1. Symbols와 Source를 연결하여 문제가 있는 코드 라인 번호 정보를 파악
명령어 : !analyze -v
원인 파악
명령어 : ~*kvn
문제가 있는 threads 찾고
오류 코드 라인 파악 및 소스코드 open 해서 파악
명령어 : u 함수 이름 or 주소
어셈블리 코드를 보고 확실한 오류 원인 분석
명령어 : r
오류 발생 상황의 레지스터 상태 확인
2. 인자 값을 확인함
문제가 있는 함수의 인자 값을 확인
da 명령을 통해 인자 값 메모리 주소의 정보를 파악
구조체의 경우 dt 명령 사용
결과적으로 문제가 있는 코드라인 정보를 파악하는 것이 목표임.
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
'Tool 사용법 > WinDBG' 카테고리의 다른 글
WinDBG 프로세스 디버깅 (유저모드 라이브 디버깅) (0) | 2020.09.11 |
---|---|
WinDBG Symbol File 이란? (0) | 2020.09.11 |
WinDBG 사용법 (0) | 2020.09.11 |