1.1.3.1. Stack Trace 관련 #
- k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace)
- k: 현재 스레드의 callstack 보기
- kf: 현재 스레드의 callstack 과 커널 스택 사용량 보기
1.1.3.2. Thread 관련 #
- ~ : thread 목록 보기
- ~#s: #번째 thread로 focus(?) 변경
- ~#k: #번째 thread의 스택 상황 보기
- ~*kvn: 전체 스레드들의 전체 콜스택
1.1.3.3. Breakpoint 관련 #
- bu: 심볼에 breakpoint 설정 -- bu module!symbol name
- ex) bu USER32!MessageBoxW
- ex) bu USER32!MessageBoxW
- bl: 설정된 브레이크포인트 목록 보기
- bc: 주어진 번호(bl로 봤을때..)의 브레이크포인트를 제거
- ba: address에 breakpoint 걸기 -- ba Access Size Address
- ex) ba e1 0xXXXXXXXX -> e는 execute이고 e일때 Size는 반드시 1이어야 함.
- ex) ba e1 0xXXXXXXXX -> e는 execute이고 e일때 Size는 반드시 1이어야 함.
1.1.3.4. Disassemble 관련 #
- uf: symbol을 disassemble
- ex) uf win!WndProc+0x19b
- ex) uf win!WndProc+0x19b
- u: address를 disassemble
- ex) u 0xXXXXXX L(-)# -- #만큼 이후(이전) 코드 disassemble
- ex) u 0xXXXXXX L(-)# -- #만큼 이후(이전) 코드 disassemble
1.1.3.5. Memory 관련 #
- r: 현재 스레드의 register 상태 보기
- !teb: 현재 스레드의 thread environment block
- du: unicode 문자열
- da: ASCII 문자열
1.1.3.6. Symbols 관련 #
- .sympath+: 심볼 패스 추가 ex) .sympath+ c:\mysymbols
- lm: 현재 로드된 심볼의 목록
- lmvm: 특정 모듈 자세히 보기
- ex) lmvm mydll
- ex) lmvm mydll
- ld, .reload: 심볼 load/unload관련
- ex) ld ntdll
- x: 심볼 목록 보기
- ex) x USER32!Message* -- Message로 시작되는 User32의 모든 심볼 목록 보기
- ex) x USER32!Message* -- Message로 시작되는 User32의 모든 심볼 목록 보기
- 언로드된 심볼 로드
- ex) .reload /unl mymodule.dll
- ex) .reload /unl mymodule.dll
- ex) ld ntdll
1.2. 심볼 설정 #
- MS 기호 서버 경로
- 웹 심볼
- 추가 경로는
-
- 닷넷 프레임 워크
https://blogs.msdn.microsoft.com/devops/2012/12/10/creating-ngen-pdbs-for-profiling-reports/
http://msdl.microsoft.com/download/symbols
- 웹 심볼
SRV*로컬저장위치*URL
- 추가 경로는
;
로 구분-
.pd_
와 같이 compressing된 심볼 파일 경로는 로컬 위치도 SRV*
를 사용한다.- 닷넷 프레임 워크
.ni.dll
기호가 없을 때: Ngen.exe (Native Image Generator)을 이해해야 한다. processor-specific machine code
를 기억하면 된다.https://blogs.msdn.microsoft.com/devops/2012/12/10/creating-ngen-pdbs-for-profiling-reports/
심볼 설정 예
SRV*D:\ossymbols*http://msdl.microsoft.com/download/symbols;SRV*D:\mysymbolserver;D:\mysymbols.reload
1.3. 디버거 연결 변경 #
[PNG image (7.38 KB)]
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Name | Type | Data |
Auto | REG_SZ | 1 / 0 |
Debugger | REG_SZ | "C:\Program Files (x86)\Debugging Tools for Windows\windbg.exe" -p %ld %e -%ld -g |
-e %ld: 크래시가 발생되어 처리할 디버그 이벤트
-g: 디버거가 실행되는 순간 대기 없이 계속 디버기를 수행할 것
2.1. Access violation 분석 #
1.
2.
3.
4.
!analyze -v
실행. AV 발생 확인2.
r
마지막 실행하던 메모리 번지와 레지스터 상태 확인. AV가 발생한 원인인 유효하지 않은 메모리 번지 확인3.
dd 메모리번지
. 원인이 된 접근하려는 메모리 번지가 정말 유효하지 않은지 확인4.
dv
발생 당시 로컬 변수 확인2.2. 스레드 분석 #
1.
2.
3.
~
모든 스레드 확인2.
!teb 스레드주소
의심스러운 스레드 TEB(thread environment block) 확인. StackBase, StackLimit 주소 확인.3.
!dps StackLimit StackBase
스레드 스택 영역 메모리 분석.3.2. 좀 더 간단한 디버거 DbgDiag #
DbgDiag from Microsoft
WinDbg 수준에는 미치지 못하지만 간단한 덤프 디버깅 분석 도구. 복잡한 설정이 필요없기 때문에 비 개발자나 End User 대상일 때 유용할 수 있다.
문제를 파악 할 수 있는 수준에서 일반적인 오류 분석이 가능하나 더 정확한 분석은 WinDbg가 필요할 수 있음.
WinDbg 수준에는 미치지 못하지만 간단한 덤프 디버깅 분석 도구. 복잡한 설정이 필요없기 때문에 비 개발자나 End User 대상일 때 유용할 수 있다.
문제를 파악 할 수 있는 수준에서 일반적인 오류 분석이 가능하나 더 정확한 분석은 WinDbg가 필요할 수 있음.
Quick Start
* Launch the "DebugDiag Analysis" application
* Select the "CrashHangAnalysis" checkbox on the main page
* Drag-and-drop your dump into the "Data files" pane on the main page
* Click "Start Analysis"
* Launch the "DebugDiag Analysis" application
* Select the "CrashHangAnalysis" checkbox on the main page
* Drag-and-drop your dump into the "Data files" pane on the main page
* Click "Start Analysis"