이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Tool 사용법/WinDBG

WinDBG Dump 파일 디버깅 (유저모드 덤프 디버깅)

이쿠우우 2020. 9. 11. 20:10
반응형

 

 

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