Mini Dump에서 managed callstack 복원

CLR Exception은 일반적으로 1st Chance Exception이므로, 메모리 덤프를 수집 시에 CLR Exception에 대한 Checking이나 1st chance full user dump 로 설정하지 않으며, 일반적인 Operation에 따라서 mini dump로 수집된다. 이 경우에는 메모리 덤프로 부터 충분한 managed 정보를 얻기가 어렵다. 하지만, 몇 가지 tip을 통해 정보를 수집하는 것이 가능할 수 있다. 다음의 예를 보자.

 

다음은 mini dump상에서 !clrstack 을 입력한 결과이다. 보시다시피 정확한 method 정보를 출력해 주진 않는다.

 

Child-SP         RetAddr          Call Site

000000000012c910 00000642803bb906 xxx.Common.dll!Unknown

000000000012c990 00000642803bb6dd xxx.Common.dll!Unknown

000000000012ca90 00000642803b0fb5 xxxex.exe!Unknown

000000000012cae0 000006428046070b xxxex.exe!Unknown

000000000012cbe0 00000642803bfeab xxxex.exe!Unknown

000000000012cc50 00000642803bfd9f xxxex.exe!Unknown

000000000012ccb0 000006427f67d4a2 xxxex.exe!Unknown

 

이를 Native Callstack에서 보면, 아래와 같다. 아래 노란색 블락은 상위의 Managed Callstack matching이 되는 정보이다.

 

Child-SP          RetAddr           Call Site

00000000`0012c6b0 00000000`77d6e314 ntdll!KiRaiseUserExceptionDispatcher+0x3a

00000000`0012c780 00000642`7f67cbd7 kernel32!CloseHandle+0x5f

00000000`0012c7b0 00000642`803bbfee mscorwks!DoNDirectCall__PatchGetThreadCall+0x7b

00000000`0012c850 00000642`803bbccd ttt.IL_STUB(IntPtr)+0x3e

00000000`0012c910 00000642`803bb906 0x642`803bbccd

00000000`0012c990 00000642`803bb6dd 0x642`803bb906

00000000`0012ca90 00000642`803b0fb5 0x642`803bb6dd

00000000`0012cae0 00000642`8046070b 0x642`803b0fb5

00000000`0012cbe0 00000642`803bfeab 0x642`8046070b

00000000`0012cc50 00000642`803bfd9f 0x642`803bfeab

00000000`0012ccb0 00000642`7f67d4a2 0x642`803bfd9f

 

여기서 좀 더 확인할 수 있는 것은 MethodDesc 정보이다. 예를 들어, 0x642`803bbccd MethodDesc Jitted Address이므로, 다음과 같은 몇몇 정보를 더 얻을 수 있다.

 

0:000> !ip2md 0x642`803bbccd

MethodDesc: 000006428016d1e8

Method Name: xxx.Common.dll!Unknown

Class: 00000642801b4f28

MethodTable: 000006428016d340

mdToken: 06000080

Module: 0000064280014320

IsJitted: yes

m_CodeOrIL: 00000642803bbbe0

 

일단, 해당 Method의 정보는 Clrstack의 출력과 동일하게 잘 이해할 수 없는 정보이다. 정확한 Method 명을 알기 위해서 해당 assembly에 대한 Binary가 필요하다. Binary에 포함되어 있는 MetaData에 해당 Token 정보를 통해 Method를 확인하는 작업이 가능하다. 이는 ildasm.exe 라는 tool이 정보를 제공할 수 있다. 해당 Binary Ildasm에서 Open 하고, View Menu Meta Info show Click 하면, MetaData 정보를 얻을 수 있다. Find 를 통해서 해당 Token(06000080) 으로 확인해 보면 아래와 같이 해당 Method 이름이 Foo2Bar 임을 알 수 있다.

 

        Method #22 (06000080)

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

               MethodName: Foo2Bar (06000080)

               Flags     : [Private] [HideBySig] [ReuseSlot]  (00000081)

               RVA       : 0x00004e90

               ImplFlags : [IL] [Managed]  (00000000)

               CallCnvntn: [DEFAULT]

               hasThis

               ReturnType: Void

               1 Arguments

                       Argument #1:  String

               1 Parameters

                       (1) ParamToken : (080000a8) Name : label flags: [none] (00000000)

 

이와 같은 방법을 통해서 mini dump에서 managed callstack을 복원할 수 있다.

by 강세윤 | 2009/03/11 15:50 | Windows debugging | 트랙백 | 덧글(0)
트랙백 주소 : http://byung.egloos.com/tb/4818393
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >