Crash Dump Analysis Patterns (Part 5b)
Crash Dump Analysis Patterns (Part 5b)
번역: Heejune Kim (https://insidekernel.net , drost@naver.com)
번역일: 2007-11-13
이번에는 이전에 작성했던 최적화된 코드 패턴(Optimized Code Pattern)의 다음 내용입니다. OMAP 코드 최적화라고 불리는 이것은 초보자를 종종 당황케 합니다. 메모리에 코드가 작게 올라가야 할 때 사용됩니다. 그래서 컴파일 된 함수가 flat 주소 공간 대신(한 덩어리로 묶여있는 대신)에 여기저기 흩어진 코드 조각들로 이루어 집니다. 이것은 특정 주소에 있는 OMAP 코드를 디스어셈블 할 때 상당히 애매하게 만듭니다. WinDbg가 주소 범위를 (함수 소스 코드의 시작 위치에서 시작하는) 함수 오프셋으로 다뤄야 할지, 아니면 그냥 (그 함수의 주소에서 시작하는)메모리 레이아웃 오프셋으로 다뤄야 할지 모르기 때문입니다. IoCreateDevice 함수 코드를 통해서 설명 드리겠습니다.
함수의 처음 주소로부터 시작하는 랜덤 주소를 evaluate 해봅시다. (메모리 레이아웃 오프셋):
kd> ? nt!IoCreateDevice
Evaluate expression: -8796073668256 = fffff800`01275160
kd> ? nt!IoCreateDevice+0×144
Evaluate expression: -8796073667932 = fffff800`012752a4
kd> ? fffff800`012752a4-fffff800`01275160
Evaluate expression: 324 = 00000000`00000144
만약 같은 주소에 있는 코드를 디스어셈블 하려고 하면 표현식(expression)은 마찬가지로 메모리 레이아웃 오프셋으로써 evaluate될 것입니다:
kd> u nt!IoCreateDevice+0×144
nt!IoCreateDevice+0×1a3:
fffff800`012752a4 83c810 or eax,10h
fffff800`012752a7 898424b0000000 mov dword ptr [rsp+0B0h],eax
fffff800`012752ae 85ed test ebp,ebp
fffff800`012752b0 8bdd mov ebx,ebp
fffff800`012752b2 0f858123feff jne nt!IoCreateDevice+0×1b3
fffff800`012752b8 035c2454 add ebx,dword ptr [rsp+54h]
fffff800`012752bc 488b1585dcf2ff mov rdx,qword ptr [nt!IoDeviceObjectType]
fffff800`012752c3 488d8c2488000000 lea rcx,[rsp+88h]
차이점을 확인할 수 있습니다: 우리는 +0x144 오프셋을 주었지만 보여지는 코드는 +0x1a3부터입니다. 이것은 OMAP 최적화가 함수 오프셋 +0x1a3에 있는 코드를 +0x144로부터 시작하는 메모리 위치로 이동시켰기 때문입니다. 다음 그림이 이것을 보여주고 있습니다:
만약 스레드 스택 트레이스에서 함수 name+offset 주소를 디스어셈블 할 때 이것을 본다면 여러분은 raw 주소를 대신 사용할 수 있습니다:
kd> k
Child-SP RetAddr Call Site
fffffadf`e3a18d30 fffff800`012b331e component!function+0×72
fffffadf`e3a18d70 fffff800`01044196 nt!PspSystemThreadStartup+0×3e
fffffadf`e3a18dd0 00000000`00000000 nt!KxStartSystemThread+0×16
kd> u fffff800`012b331e
nt!PspSystemThreadStartup+0×3e:
fffff800`012b331e 90 nop
fffff800`012b331f f683fc03000040 test byte ptr [rbx+3FCh],40h
fffff800`012b3326 0f8515d30600 jne nt!PspSystemThreadStartup+0×4c
fffff800`012b332c 65488b042588010000 mov rax,qword ptr gs:[188h]
fffff800`012b3335 483bd8 cmp rbx,rax
fffff800`012b3338 0f85a6d30600 jne nt!PspSystemThreadStartup+0×10c
fffff800`012b333e 838bfc03000001 or dword ptr [rbx+3FCh],1
fffff800`012b3345 33c9 xor ecx,ecx
여러분은 또한 OMAP 함수 바디를 uf 명령어를 사용하여 디스어셈블 할 수 있습니다:
kd> uf nt!IoCreateDevice
nt!IoCreateDevice+0×34d:
fffff800`0123907d 834f3008 or dword ptr [rdi+30h],8
fffff800`01239081 e955c30300 jmp nt!IoCreateDevice+0×351
…
…
…
nt!IoCreateDevice+0×14c:
fffff800`0126f320 6641be0002 mov r14w,200h
fffff800`0126f325 e92f5f0000 jmp nt!IoCreateDevice+0×158
nt!IoCreateDevice+0×3cc:
fffff800`01270bd0 488d4750 lea rax,[rdi+50h]
fffff800`01270bd4 48894008 mov qword ptr [rax+8],rax
fffff800`01270bd8 488900 mov qword ptr [rax],rax
fffff800`01270bdb e95b480000 jmp nt!IoCreateDevice+0×3d7
nt!IoCreateDevice+0xa4:
fffff800`01273eb9 41b801000000 mov r8d,1
fffff800`01273ebf 488d154a010700 lea rdx,[nt!`string’]
fffff800`01273ec6 488d8c24d8000000 lea rcx,[rsp+0D8h]
fffff800`01273ece 440fc10522f0f2ff xadd dword ptr [nt!IopUniqueDeviceObjectNumber],r8d
fffff800`01273ed6 41ffc0 inc r8d
fffff800`01273ed9 e8d236deff call nt!swprintf
fffff800`01273ede 4584ed test r13b,r13b
fffff800`01273ee1 0f85c1a70800 jne nt!IoCreateDevice+0xce
…
…
…
- Dmitry Vostokov -
Comments
- Anonymous
September 17, 2008
PingBack from http://blog.a-foton.ru/2008/09/crash-dump-analysis-patterns-part-5b/