Udostępnij za pośrednictwem


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