"[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는 해당 스레드의 레지스터 콘텍스트로 변경되면서 스레드의 콜 스택을 보여준다.

11. .frame X
Frame은 콜스텍의 한 단계를 의미한다.
함수가 호출될 때마다 스택에 하나의 프레임이 만들어지고, Windbg에서는 이를 Frame처럼 번호를 붙여 보여준다.
프레임 순서를 보려면 kn을 명령어에 친다. 그럼 맨 앞에 아래처럼 현재 함수의 프레임 번호가 나온다.
00 000000b2`4c8ff5c0 MyGame!Crash
01 000000b2`4c8ff620 MyGame!Update
02 000000b2`4c8ff680 MyGame!Tick
03 000000b2`4c8ff6e0 MyGame!GameLoop
가끔 덤프가 남는 곳이 너무 심연이라. excr 해도 코드가 로드 안될 때 있는데 우리가 볼 수 있는 코드로 옮기기 좋은 명령어다.
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 |
존잘 프로그래머가 되고싶어