반응형

업무 중에 crash가 발생한 프로그램에 대한 메모리 덤프를 뜬 파일을 분석하게 되었습니다.

어느 부분에서 crash가 발생하였는지 확인하는 과정을 나열해 봅니다.

(※ 해당 crash 파일은 MiniDumpWriteDump API의 "MiniDumpNormal"로 설정한 파일 입니다.)

 

본문에서는 반어를 사용합니다. 이점 양해 부탁 드립니다.

-------------------------------------------------------------------------

 

crash가 발생하여 메모리를 dump를 뜬 파일을 전달 받았다.

해당 파일을 windbg로 열어서 어느 부분에서 crash가 발생하였는지 확인 해보도록 하자.

 

우선, dump 파일을 windbg의 crash file open 메뉴를 이용하여 파일을 읽어야 한다.

그렇지 않을 경우 아래와 같은 화면이 나오므로 다시 Open 하기 바란다.

 

 

 

해당 파일은 crash 파일인데 그냥 열겠냐?

라는 메시지다. yes를 누르면 아래와 같이 분석 할 수 없는 내용이 나온다.

 

 

따라서, windbg에서 crash dump 파일을 분석할 수 있는 기능인 "Open Crash Dump" 메뉴를 이용하여

파일을 열어야 분석 할 수 있는 환경이 만들어 진다.

 

 

 

굳이, 분석을 진행하지 않더라도 간단하게 어떤 이유로 crash가 발생 했는지 확인 할 수 있다.

예제 파일은 "Access violation" 으로 크래쉬가 발생한 것이다.

 

 

그럼 조금 더 분석을 하기 위해서 windbg 명령인 "!analyze -v"를 실행 한다.

 

0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************


FAULTING_IP:
test+1b1a
00401b1a c6400100        mov     byte ptr [eax+1],0

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 00401b1a (test+0x00001b1a)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 00000001
Attempt to write to address 00000001

CONTEXT:  00000000 -- (.cxr 0x0;r)
eax=00000000 ebx=0a280aa8 ecx=7f680000 edx=0008e3c8 esi=0a280a68 edi=0018f08c
eip=77e70c42 esp=0018ed4c ebp=0018ed5c iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!NtGetContextThread+0x12:
77e70c42 83c404          add     esp,4

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_WRITE

PROCESS_NAME:  test.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

EXCEPTION_PARAMETER1:  00000001

EXCEPTION_PARAMETER2:  00000001

WRITE_ADDRESS:  00000001

FOLLOWUP_IP:
test+1b1a
00401b1a c6400100        mov     byte ptr [eax+1],0

APP:  test.exe

ANALYSIS_VERSION: 6.3.9600.16384 (debuggers(dbg).130821-1623) x86fre

FAULTING_THREAD:  00002704

PRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_WRITE

BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_WRITE

LAST_CONTROL_TRANSFER:  from 00401f46 to 00401b1a

STACK_TEXT: 
WARNING: Stack unwind information not available. Following frames may be wrong.
0018fe70 00401f46 00000000 00000000 cccccccc test+0x1b1a
0018fed4 00411808 00400000 00000000 0a0da4ed test+0x1f46
0018ff80 0041156f 0018ff94 7745336a 7efde000 test+0x11808
0018ff88 7745336a 7efde000 0018ffd4 77e89f72 test+0x1156f
0018ff94 77e89f72 7efde000 558d3134 00000000 kernel32!BaseThreadInitThunk+0xe
0018ffd4 77e89f45 00411560 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70
0018ffec 00000000 00411560 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b


STACK_COMMAND:  ~0s; .ecxr ; kb

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  test+1b1a

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: test

IMAGE_NAME:  test.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  53210e00

FAILURE_BUCKET_ID:  NULL_CLASS_PTR_WRITE_c0000005_test.exe!Unknown

BUCKET_ID:  APPLICATION_FAULT_NULL_CLASS_PTR_WRITE_test+1b1a

ANALYSIS_SOURCE:  UM

FAILURE_ID_HASH_STRING:  um:null_class_ptr_write_c0000005_test.exe!unknown

FAILURE_ID_HASH:  {f756d029-0188-112b-7fe5-3c317ed11732}

Followup: MachineOwner
---------

 

 

test+1b1a 00401b1a c6400100        mov     byte ptr [eax+1],0

 

위 코드로 인하여, 실행하는 과정에서 문제가 발생 하였다.

해당 Address를 알 수 있으므로, 디버깅하기는 수월할 것이다.

(소스 코드와 연동하면 더욱 더 편하게 분석 할 수 있다.)

 

조금 더 아래로 내려와서 분석을 하다보면

 

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_WRITE

 

이런 내용이 보일 것이다. 해당 내용은 Write 하려는 class pointer가 NULL 값을 가지므로 인해서

Write 할 수 없다는 의미이다.

 

이것으로 crash dump 분석을 마무리 하도록 하겠다.

반응형

+ Recent posts