"[windbg] windbg 사용하기, 덤프 분석하기"
1. 덤프를 읽을 심볼과 심볼에 맞는 소스코드 경로를 연결시킨다.


2. 덤프를 windbg에 드래그 드롭 또는 open으로 파일을 열면 이런 화면을 볼수 있다.
- Loading Dump File : 덤프 파일의 위치, 덤프 종류
- Executable search path is : 덤프가 발생한 OS
- Debug sesstion time : 덤프 발생 시점 시간
- Process Uptime: 부팅 이후 동작한 시간

3. !analyze -v 명령어 실행

!analyze-v 명령어를 실행하면 더욱 자세하게 덤프 내용이 나온다.
- FAULTING_IP: 어떤 부분에서 문제가 일어났는지 표시한다. callstack의 마지막 부분이다.
KERNRLBASE.ddl에서 문제가 발생했으며 [ esp+54h ]의 주소가 가리키는 4바이트(Dword)인 어떤 값을 ecx에 복사하다가 문제가 발생했음. 이라고 해석이 된다. 하지만 Kernelbase는 windows자체 시스템 구성 요소를 잘못 사용하거나 할 때 자주 발생하므로 라이브러리를 잘못쓴게 없는지 보는게 중요하다.

STACK_TEXT: 문제가 일어난 시점으로 가는 callstack을 보여준다,


또한 여기서 추가로 알 수 있는 정보가 있다.
- 노란색 박스 - 스택 프레임 시작
- 핑크생 박스 - 리턴 주소
- 하늘색 박스 - 인자값: 뭔지 모르겠음
이런 한 주소를 사용하는 예시로 만약 오류가 발생한 함수의 위치가 다양하다면, [ kvn L=리턴주소 ] 명령어를 통해 어떤 곳으로 리턴하는지 확인할 수 있다.
4. .ecxr
덤프를 더욱 자세히 보자.
.ecxr 명령어: 현재 예외와 연결된 컨텍스트 레코드를 표시한다.
- 크래시 덤프(미니 덤프만 해당됨)
- 컨텍스트 레코드는 보통 CPU레지스터 셋(Register Set)을 의미한다.
5. ~*kbn, kvn L=주소
~*kbn : 모든 Threads의 정보를 보여준다.
kvn L=주소 : 원하는 주소의 콜스택을 볼수 있다.
더욱 자세히 보고 싶으면 -4씩 움직이면서 콜스택을 보자.
콜스택에서 빨간색 박스 - 시작 주소, 파란색 박스 - 리턴 주소이다.

👉 4씩 움직여 봐라 ??
x86기준으로 스택 메모리를 DWORD(4바이트) 단위로 따라가면서 직접 확인해보자.
kb로 콜스택을 보면 옆에 인자로 추정되는 값들도 나오는데 kb 출력만으로 부족할 때는, 스택 포인터나 프레임 포인터 기준으로 4바이트씩 올라가며 값을 직접 볼 수가 있다.
x86기준 주소 1칸 = 4byte (ESP, EBP)
6. u [주소] , r
u [주소] : 원하는 [주소] 어셈블러 볼수 있다
r : 현재 레지스터 정보를 표시해준다.


7. dd (display dwords)
해당 주소부터 메모리 내용을 4바이트씩 끊어서 보여준다
함수 인자/리턴 주소/저장된 EBP등이 보통 4바이트 단위로 되어있다.
맨 왼쪽 == 시작주소
그 뒤 값들 = 그 주소부터 읽은 4바이트
8. ★[ 이거 유용하다..! ] dps
스택에 있는 값이 해석 가능하면 함수명도 같이 보여준다.
0012ff40( 스택의 그 칸 자체 주소 ) 77ab1234( 그 칸 안에 들어있는 값(포인터처럼 해석한 값) ) ntdll!XXXXXX.cpp
0012ff44 00401000 PinkoTistory::Update+0x8b1
0039ff44 39489333
9. ln 주소
dd로 본 값이 어느 함수 근처인지 확인 할 수.도.? 있다.
10. view를 활용하자.
,ecxr 명령어를 실행 후 [call stack] view와 [Loal] view를 오픈한다.
call stack에 나와 있는 함수들을 클릭하면 그 함수를 실행할 때의 Local 변수들이 나온다.
미니 덤프가 아닌 경우 Local 변수에 남아 있는 값을 보고 어떤 값으로 인해 덤프가 발생했는지 확인이 가능 하다.
실행 파일의 코드를 연결해두었다면, call stack을 더블클릭 했을 때 소스코드로 연결이 된다.
memory와 registers view를 통해 원하는 주소를 검색하면 메모리와 레지스터를 확인할 수 있다.


프로세스와 스레트 view은 현재 프로세스의 모든 스레드를 보여준다. 스레드 목록 중 다른 스레드를 더블클릭하면 windbg는 해당 스레드의 레지스터 컨텍스트로 변경되면서 스레드의 콜 스택을 보여준다.

12. 레지스터 !!!!! 종류
x86과 x64 기준 레지스터 용어가 바뀐다. (ESP -> RSP "E"가 "R"로 바뀐다)
- EAX(eax) / RAX
- 함수에서 뭘 반환했는지 볼 수 있다.
- ESP(esp : stack pointer) / RSP
- 현재 스택의 맨 위를 가리키는 주소
- 스택 덤프 볼 때 기준
- EDP(ebp) / RDP
- 현재 함수 프레임 기준점
- EIP(eip) / RIP
- 실행 중인 코드 위치
- !analyze -v : 기본 분석
- .ecxr : 예외 시점 컨텍스트로 이동
- kv : 콜스택 보기
- k : 기본 콜 스택 -> 누가 누구를 호출 했는지 ?
- kb : 콜 스택 + 인자 표시 -> 누가 누구를 호출했는지 ?
- kv : 더 자세한 정보(FPO/심볼 정보 등)
- kp : 함수 인자를 좀 더 보기 좋게 표시
- kn : 프레임 번호 포함해서 표시
- lmvm vcruntime140 : DLL base address / symbol 상태
- ln @rip : 현재 주소가 어느 심볼 근처인지
- ub @rip, u @rip : 앞뒤 디스어셈 확인
- dd = display dwords
- d = display
- dv 현재 프레임 로컬 값
끝!!
더 알게되는 내용 있으면 계속 정리해서 업데이트 해두겠습니다~~~

'👨🏻💻 programming > ◽ 툴(tool)' 카테고리의 다른 글
| Mixamo Converter 사용법 (0) | 2026.03.04 |
|---|---|
| [Perforce/P4V] warning : Can't clobber writable file .... (0) | 2025.05.29 |
| (VCS) svn 사용 방법 익히기! (2) | 2022.12.31 |
| (Version Control System/VCS) 버전관리 시스템 (0) | 2022.12.29 |
| visual studio - 사용자가 선택한 파일을 솔루션 탐색기에서 자동으로 파일 찾아주는 설정. (0) | 2022.10.07 |
존잘 프로그래머가 되고싶어