|
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 강세윤 at 12/15 오늘 많이 헤매다..알게 .. by youna at 12/14 글 잘 읽었습니다 . 전 .. by 위시 at 11/26 어렷다 by klhk at 11/09 dhjjgbem by kl at 11/09 17번부터 어떻게 접는지.. by tykim0131 at 10/28 ATL이나 MFC를 이용하.. by 김명신 at 09/24 복원되었군요.. 제 RSS.. by 강세윤 at 09/24 허걱, 하고 있는 것으로.. by 강세윤 at 09/15 RSS 주소 서비스는 안 .. by 정성태 at 09/15 이글루 파인더
| |||