13. kb
현재 스레드의 Stack 출력
k 커맨드 의 변형 : k[b|p|P|v]
0:001> kb
# ChildEBP RetAddr Args to Child
00 00b1feec 6f85a273 000d87f0 c81c2e95 00000000 dumptest1!SecondThreadFunc+0x4f
01 00b1ff28 6f85a204 000d8c08 00b1ff40 7592336a MSVCR100D!_beginthreadex+0x243
02 00b1ff34 7592336a 000d8c08 00b1ff80 775e9f72 MSVCR100D!_beginthreadex+0x1d4
03 00b1ff40 775e9f72 004c8d80 76f645d5 00000000 kernel32!BaseThreadInitThunk+0xe
04 00b1ff80 775e9f45 6f85a180 004c8d80 00000000 ntdll!__RtlUserThreadStart+0x70
05 00b1ff98 00000000 6f85a180 004c8d80 00000000 ntdll!_RtlUserThreadStart+0x1b
프레임 EBP
번호
리턴 주소
함수 파라메터
함수 심볼
13
14. dv (Display Local Variables)
지역변수 확인
0:001> dv
i = 0n516
param = 0x000d87f0
sum = 0n1997962443
arr = 0x000d87f0
14
15. !address [주소]
[주소] 가 속하는 메모리 영역 정보 출력
0:001> !address 0x000d87f0
Usage:
Heap
Base Address:
000d0000
End Address:
000d9000
Region Size:
00009000
State:
<info not present at the target>
Protect:
<info not present at the target>
Type:
<info not present at the target>
Allocation Base:
<info not present at the target>
Allocation Protect: <info not present at the target>
More info:
heap owning the address: !heap 0xd0000
More info:
heap segment
More info:
heap entry containing the address: !heap -x 0xd87f0
15
16. ?
? 표현식 : 표현식을 평가
0:001> ? 0n520 * 4
Evaluate expression: 2080 = 00000820
? : 도움말 출력
0:001> ?
Open debugger.chm for complete debugger documentation
B[C|D|E][<bps>] - clear/disable/enable breakpoint(s)
BL - list breakpoints
BA <access> <size> <addr> - set processor breakpoint
BP <address> - set soft breakpoint
…..
Menu -> Help -> Index 참조
16
22. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
return local;
}
int main(int argc, char* argv[]) {
EIP -> Sum(3, 4);
return 0;
}
109
105
101
xxxx
<- ESP,EBP
22
23. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
return local;
}
int main(int argc, char* argv[]) {
EIP -> Sum(3, 4);
return 0; <- addr1
}
109
105
addr1
<- ESP
3
4
101
xxxx
<- EBP
23
24. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
EIP -> int local = 0;
local = arg1 + arg2;
Print(local);
return local;
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
105
101
<- ESP,EBP
addr1
3
4
101
xxxx
24
25. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
EIP -> int local = 0;
local = arg1 + arg2;
Print(local);
return local;
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
0
105
<- ESP
101
<- EBP
addr1
3
4
101
xxxx
25
26. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
EIP -> local = arg1 + arg2;
Print(local);
return local;
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
7
105
<- ESP
101
<- EBP
addr1
3
4
101
xxxx
26
27. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
EIP -> Print(local);
return local; <- addr2
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
addr2
<- ESP
7
7
105
101
<- EBP
addr1
3
4
101
xxxx
27
28. Stack Frame 구조
void Print(int sum) {
EIP -> printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
return local; <- addr2
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
105
<- ESP,EBP
addr2
7
7
105
101
addr1
3
4
101
xxxx
28
29. Stack Frame 구조
void Print(int sum) {
EIP -> printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
return local; <- addr2
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
Print
frame
109
105
<- ESP,EBP
addr2
7
Sum
frame
7
105
101
addr1
3
Main
frame
4
101
xxxx
29
30. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
EIP -> return local; <- addr2
}
int main(int argc, char* argv[]) {
Sum(3, 4);
return 0; <- addr1
}
109
105
addr2
7
7
105
<- ESP
101
<- EBP
addr1
3
4
101
xxxx
30
31. Stack Frame 구조
void Print(int sum) {
printf("%d", sum);
}
int Sum(int arg1, int arg2) {
int local = 0;
local = arg1 + arg2;
Print(local);
return local; <- addr2
}
int main(int argc, char* argv[]) {
Sum(3, 4);
EIP -> return 0; <- addr1
}
109
105
addr2
7
7
105
101
addr1
3
4
101
xxxx
<- ESP,EBP
31
32. Manual Stack Trace
!teb : Thread Environment Block 정보 출력
스레드 스택 범위 확인 가능
0:000> !teb
TEB at 7ffdf000
ExceptionList:
StackBase:
StackLimit:
…..
001bd958
001c0000
001ae000
32
33. Manual Stack Trace
dds : 지정한 메모리 범위를 4바이트 단위로 일렬로 나열
심볼 연동
스택 범위 입력
dds 001ae000 001c0000
StackBase: 001c0000
StackLimit: 001ae000
스택 범위 추정하여 입력(추천)
dds esp esp+3000 <-임의의값
33
36. 상황
어플리케이션의 UI가 행이 걸려서 응답이 없는 상황
재현은 되지 않음
해당 상황에서 프로세스 덤프는 확보 되었음
36
37. Hang 분석 명령어
!analyze -v –hang
Hang 정보 추가 분석
!locks
Lock이 걸린 Critical Section 정보
DERIVED_WAIT_CHAIN:
Dl Eid Cid WaitType
-- --- ------- -------------------------0 1584.1588 Event
0:036> !locks
CritSec nlaapi!gLPCCS+0 at 747bd0bc
WaiterWoken
No
LockCount
0
RecursionCount 1
OwningThread
1588
EntryCount
0
ContentionCount 0
*** Locked
37
52. .reload /i
심볼이 안맞을때 강제로 맞추기
빌드 환경과 소스가 같다면 거의 같은 pdb가 생성되므로 강제로 매치시킬 수 있음
0:001> kc
WARNING: Frame IP not in any known module. Following frames may be wrong.
00 0x0
01 MSVCR100D!_beginthreadex
02 MSVCR100D!_beginthreadex
0:001> .reload /i dumptest1.exe
*** WARNING: Unable to verify checksum for dumptest1.exe
0:001> kc
00 dumptest1!SecondThreadFunc
01 MSVCR100D!_beginthreadex
02 MSVCR100D!_beginthreadex
52