(간단하게) Managed Application의 Crash dump 확인하기 Windows debugging

Application Crash가 발생하여 Terminated가 되는 현상을 Debugging 할 때, Live로 하기 어려운 경우, AD+ DebugDiag Tool을 이용하여 Crash Dump(Application이 불현듯 죽을 때”-http://byung.egloos.com/3831955 참조)를 간혹 수집하곤 한다. 그리고, 수집된 memory dump를 가지고 문제가 발생한 위치를 추적하는 작업을 진행하는 데, 이를 위해서는 Debugging tools for Windows (http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx ) 라는 Microsoft가 제공하는 Debugging tool에서 제공하는 Windbg.exe를 이용한다.

Application Crash가 빈번하게 발생하면, 문제가 발생한 machine에 언급한 Debugging Tools Install하고 특히, Debugging Tools for Windows Install하면, 제공하는 ADplus.vbs를 이용하여 process monitoring을 하다가 Crash가 발생하는 경우 memory dump를 수집할 수 있다. 보통 다음과 같은 command 를 이용한다.

 

 adplus –crash –p 1234 –o f:\dumps


(1234
PID이고, f:\dumps folder Crash_XXX 라는 Folder dump가 수집됨.)

 

Dump가 수집되면, Windbg를 이용하여 분석하는 작업을 하게 되는 데, 먼저, Dump Open하기 전에 Debugging을 위해서는 반드시 Symbols이 필요하다. Microsoft public symbol을 위해서는 다음과 같이 symbol path를 입력(file menu Symbol File Path… open)해 주어야 한다.

 

 SRV*C:\symbols*http://msdl.microsoft.com/download/symbols

 

그리고, Custom Application에 대한 debugged symbol.pdb files .dll files에 대한 directory path를 추가해야 한다. 예를 들어, 해당 custom files가 위치한 directoryc:\customApp\symbols 라면,

 

 SRV*C:\symbols*http://msdl.microsoft.com/download/symbols;c:\customApp\symbols

 

와 같이 추가하면 된다.

 

해당 dmp file windbg를 통해서 open(menu File > open crash dump …)하면 다음과 같은 출력을 우선적으로 확인할 수 있다.

 

Microsoft (R) Windows Debugger Version 6.10.0000.151 X86

Copyright (c) Microsoft Corporation. All rights reserved.

 

 

Loading Dump File [C:\mine\Job_cases\PID-5896__xxx__2nd_chance_NET_CLR__full_1834_2007-07-05_07-57-23-625_1708.dmp]

User Mini Dump File with Full Memory: Only application data is available

 

Comment: '2nd_chance_NET_CLR_exception_in_xxx'

Symbol search path is: srv*c:\symbols_pub*http://msdl.microsoft.com/download/symbols

Executable search path is:

Windows Server 2003 Version 3790 (Service Pack 1) MP (8 procs) Free x86 compatible

Product: Server, suite: TerminalServer SingleUserTS

Debug session time: Thu Jul  5 07:57:24.000 2007 (GMT+9)

System Uptime: 47 days 7:04:45.765

Process Uptime: 2 days 21:35:55.000

...................................................................................................................................

Loading unloaded module list

.

This dump file has an exception of interest stored in it.

The stored exception information can be accessed via .ecxr.

(1708.205c): CLR exception - code e0434f4d (first/second chance not available)

eax=05e3ec78 ebx=001e74e8 ecx=00000000 edx=00000025 esi=05e3ed04 edi=e0434f4d

eip=7c815e02 esp=05e3ec74 ebp=05e3ecc8 iopl=0         nv up ei pl nz na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202

kernel32!RaiseException+0x53:

7c815e02 5e              pop     esi

 

먼저, 보여주는 정보는 process uptime이나, system uptime 정보 그리고, Crash가 발생한 시점의 context 정보를 출력한다. 그리고, 해당 Application .Net 기반의 Application으로 CLR Exception이 발생하여 Crash가 된 경우임을 보여준다. CLR exception Code e0434f4d이다.

Managed Application debugging을 위해서는 SOS.dll라는 CLR debugger Extension의 도움을 받아야 한다. SOS load하기 위해서 다음과 같은 Command Windbg에서 입력한다.

 

.loadby sos mscorwks

 

그리고, callstack에서 mscorwks!RaiseTheExceptionInternalOnly function의 첫 번째 parameter 값을 확인해야 한다. 이 첫 번째 parameter Exception에 대한 정보를 갖고 있기 때문이다. 해당 작업을 다음과 같이 진행한다.

 

0:024> kbL

ChildEBP RetAddr  Args to Child             

05e3ecc8 79f97065 e0434f4d 00000001 00000001 kernel32!RaiseException+0x53

05e3ed28 7a0945a4 014d52e8 00000000 00000000 mscorwks!RaiseTheExceptionInternalOnly+0x226

05e3edec 79653a02 014d5148 00000008 014d5180 mscorwks!JIT_Throw+0xd0

05e3ee4c 7936f43b 00000000 00000000 00000000 mscorlib_ni!System.IO.__Error.WinIOError(Int32, System.String)+0x1ebcee

. . .

 

0:024> !DumpObj 014d52e8

Name: System.IO.IOException

MethodTable: 79112024

EEClass: 79111fac

Size: 76(0x4c) bytes

 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

Fields:

      MT    Field   Offset                 Type VT     Attr    Value Name

790fa3e0  40000b5        4        System.String  0 instance 00000000 _className

79109208  40000b6        8 ...ection.MethodBase  0 instance 00000000 _exceptionMethod

790fa3e0  40000b7        c        System.String  0 instance 00000000 _exceptionMethodString

790fa3e0  40000b8       10        System.String  0 instance 014d5524 _message

79113dfc  40000b9       14 ...tions.IDictionary  0 instance 00000000 _data

790fa9e8  40000ba       18     System.Exception  0 instance 00000000 _innerException

790fa3e0  40000bb       1c        System.String  0 instance 00000000 _helpURL

790f9c18  40000bc       20        System.Object  0 instance 014d5844 _stackTrace

790fa3e0  40000bd       24        System.String  0 instance 00000000 _stackTraceString

790fa3e0  40000be       28        System.String  0 instance 00000000 _remoteStackTraceString

790fed1c  40000bf       34         System.Int32  1 instance        0 _remoteStackIndex

790f9c18  40000c0       2c        System.Object  0 instance 00000000 _dynamicMethods

790fed1c  40000c1       38         System.Int32  1 instance -2147024864 _HResult

790fa3e0  40000c2       30        System.String  0 instance 00000000 _source

790fe160  40000c3       3c        System.IntPtr  1 instance        0 _xptrs

790fed1c  40000c4       40         System.Int32  1 instance -532459699 _xcode

790fa3e0  4001b5f       44        System.String  0 instance 014d4f40 _maybeFullPath

 

0:024> !DumpObj 014d5524

Name: System.String

MethodTable: 790fa3e0

EEClass: 790fa340

Size: 390(0x186) bytes

 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)

String: The process cannot access the file 'C:\MyApp\ReceiverLog.txt' because it is being used by another process.

Fields:

      MT    Field   Offset                 Type VT     Attr    Value Name

790fed1c  4000096        4         System.Int32  1 instance      187 m_arrayLength

790fed1c  4000097        8         System.Int32  1 instance      167 m_stringLength

790fbefc  4000098        c          System.Char  1 instance       54 m_firstChar

790fa3e0  4000099       10        System.String  0   shared   static Empty

    >> Domain:Value  00156260:790d6584 <<

79124670  400009a       14        System.Char[]  0   shared   static WhitespaceChars

    >> Domain:Value  00156260:011013ec <<

 

그러므로, 해당 Crash IOException이며, “The process cannot access the file 'C:\MyApp\ReceiverLog.txt' because it is being used by another process.” 오류로 인하여 문제가 발생했음을 알 수 있다. 그리고, 해당 문제가 발생한 Callstack은 앞서서 보여줬던 kb command에 의한 unmanaged callstack을 확인해서는 알 수 없기 때문에 !clrstack 또는 !dumpstack –EE 에 의해서 문제가 발생한 시점까지의 managed callstack을 확인해야 한다.

 

0:024> !clrstack

OS Thread Id: 0x205c (24)

ESP       EIP    

05e3ed50 7c815e02 [HelperMethodFrame: 05e3ed50]

05e3edf4 79653a02 System.IO.__Error.WinIOError(Int32, System.String)

05e3ee54 7936f43b System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean)

05e3ef48 7936ef30 System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions)

05e3ef74 7936eeab System.IO.StreamWriter.CreateFile(System.String, Boolean)

05e3ef84 7936ee54 System.IO.StreamWriter..ctor(System.String, Boolean, System.Text.Encoding, Int32)

05e3efa4 79475328 System.IO.StreamWriter..ctor(System.String, Boolean)

05e3efb4 05f771b4 MyApp.MyLib.WriteTxtErrorLog(System.String, System.String)

05e3efe0 05f715a2 MyApp.MyLib..ReceiveCallback(System.IAsyncResult)

. . .

 

!clrstack –a 의 경우에는 managed callstack에서 parameters 정보도 같이 출력을 얻을 수 있다. 하지만, 해당 managed application debugged build 되어 DLL pdb file 둘 다 정상적으로 제공이 되지 않으면, parameters의 값이 간혹 확인되지 않을 수 있으므로 주의해야 한다.

 

0:024> !clrstack -a

OS Thread Id: 0x205c (24)

ESP       EIP    

05e3ed50 7c815e02 [HelperMethodFrame: 05e3ed50]

. . .

 

05e3efb4 05f771b4 MyApp.MyLib.WriteTxtErrorLog(System.String, System.String)

    PARAMETERS:

        this = 0x01101974

        logPath = 0x014d4c9c

        log = 0x014d41f8

    LOCALS:

        <CLR reg> = 0x014d4e00

        0x05e3efb4 = 0x417eaf36

 

05e3efe0 05f715a2 MyApp.MyLib.ReceiveCallback(System.IAsyncResult)

    PARAMETERS:

        this = 0x01101974

        ar = 0x014d27d0

    LOCALS:

        0x05e3f088 = 0x014d2af0

        0x05e3f084 = 0x01155d9c

        0x05e3f09c = 0x00000016

        0x05e3f080 = 0x014d41f8

        0x05e3f098 = 0x00000001

        0x05e3f07c = 0x014d2c64

        0x05e3f078 = 0x014d4c9c

        0x05e3f074 = 0x00000000

        0x05e3f070 = 0x00000000

        0x05e3f06c = 0x014d3c9c

        0x05e3f068 = 0x01101974

        0x05e3f094 = 0x00000000

        0x05e3f064 = 0x014d2b30

        0x05e3f060 = 0x014d2c74


그리고, 좀 더 자세한 내용은 다음의 Link를 참조!!

Introduction to Production Debugging for .NET Framework Applications

http://msdn.microsoft.com/en-us/library/ms954590.aspx

 

Debugging Unexpected Process Termination

http://msdn.microsoft.com/en-us/library/ms954593.aspx


핑백

덧글

댓글 입력 영역