성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>ICorProfilerInfo::GetILToNativeMapping 메서드가 0x80131358을 반환하는 경우</h1> <p> 아래의 예제 코드가 있음에도 불구하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > How do you map a native to IL instruction pointer in-process ; <a target='tab' href='http://stackoverflow.com/questions/198754/how-do-you-map-a-native-to-il-instruction-pointer-in-process'>http://stackoverflow.com/questions/198754/how-do-you-map-a-native-to-il-instruction-pointer-in-process</a> </pre> <br /> 제 경우에는 GetILToNativeMapping 메서드를 아무리 호출해도 0x80131358 값만을 반환하는 군요. ^^;<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ULONG32 cNeedMap = 1024; COR_DEBUG_IL_TO_NATIVE_MAP zeroBuf[1024]; cNeedMap = 0; hr = pInfo->GetILToNativeMapping(funcId, 0, &cNeedMap, NULL); // hr == 0x80131358 </pre> <br /> Error Lookup 프로그램에서 0x80131358 값이 뭔지 조회해도 그런 값을 찾을 수 없다고 나옵니다. <br /> <br /> 그러다가, 혹시 SSCLI에서 이 답을 구할 수 도 있지 않을까 싶었는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > shared-source-cli-2.0 / clr / src / vm / proftoeeinterfaceimpl.cpp ; <a target='tab' href='https://github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/proftoeeinterfaceimpl.cpp'>https://github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/proftoeeinterfaceimpl.cpp</a> </pre> <br /> GetILToNativeMapping 구현 코드에서 오류로 인해 중간에 return 하는 것을 보니 답이 나옵니다. 바로 CORPROF_E_JITMAPS_NOT_ENABLED의 값이었던 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 2979 /* 2980 * GetILToNativeMapping returns a map from IL offsets to native 2981 * offsets for this code. An array of COR_DEBUG_IL_TO_NATIVE_MAP 2982 * structs will be returned, and some of the ilOffsets in this array 2983 * may be the values specified in CorDebugIlToNativeMappingTypes. 2984 */ 2985 HRESULT ProfToEEInterfaceImpl::GetILToNativeMapping( 2986 /* [in] */ CodeID codeId, 2987 /* [in] */ ULONG32 cMap, 2988 /* [out] */ ULONG32 *pcMap, 2989 /* [out, size_is(cMap), length_is(*pcMap)] */ 2990 COR_DEBUG_IL_TO_NATIVE_MAP map[]) 2991 { 2992 CONTRACTL 2993 { 2994 SO_NOT_MAINLINE; 2995 THROWS; // MethodDesc::FindOrCreateInstantiationAtObject throws 2996 GC_TRIGGERS; // MethodDesc::FindOrCreateInstantiationAtObject triggers 2997 } CONTRACTL_END; 2998 2999 LOG((LF_CORPROF, LL_INFO1000, "**PROF: GetILToNativeMapping 0x%p.\n", codeId)); 3000 3001 ENSURE_CALLBACK_STATE_FLAGS_SET(COR_PRF_CALLBACKSTATE_INCALLBACK); 3002 3003 // If JIT maps are not enabled, then we can't provide it 3004 if (!CORProfilerJITMapEnabled()) 3005 <span style='color: blue; font-weight: bold'>return (CORPROF_E_JITMAPS_NOT_ENABLED);</span> 3006 3007 #ifdef DEBUGGING_SUPPORTED 3008 // Cast to proper type 3009 MethodDesc *pMD = CodeIDToMethodDesc(codeId); 3010 3011 // If the code is generic, then GetCodeInfo is not really supported and may not give 3012 // accurate results. This is better than always failing, 3013 // though we may prejudice profiling by which 3014 // copy of the code we return, so we just return none. 3015 if (pMD->HasClassOrMethodInstantiation() && pMD->IsTypicalMethodDefinition()) 3016 pMD = pMD->FindOrCreateInstantiationAtObject(); // Can we pass allowCreate=FALSE to make this no trigger? 3017 3018 return (g_pDebugInterface->GetILToNativeMapping(pMD, cMap, pcMap, map)); 3019 #else 3020 return E_NOTIMPL; 3021 #endif 3022 } </pre> <br /> 이 값의 정의는 Visual C++의 CorError.h 헤더 파일에서 찾을 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > #define CORPROF_E_JITMAPS_NOT_ENABLED EMAKEHR(0x1358) </pre> <br /> CORPROF_E_JITMAPS_NOT_ENABLED의 원인은 .NET Profiler를 만져본 분들이라면 금방 눈치챌 수 있습니다. .NET Profiler는 callback 이벤트를 받을 유형을 지정할 수가 있는데요. 제 경우에는 해당 옵션을 활성화시키지 않았기 때문이었습니다. 그 옵션의 이름은 COR_PRF_MONITOR::COR_PRF_ENABLE_JIT_MAPS입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > COR_PRF_MONITOR Enumeration ; <a target='tab' href='https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/cor-prf-monitor-enumeration'>https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/cor-prf-monitor-enumeration</a> </pre> <br /> 재미있는 것은 문서의 내용입니다. 위의 글에 보면 COR_PRF_ENABLE_JIT_MAPS 옵션에 다음과 같은 내용이 있습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> <span style='color: blue; font-weight: bold'>Deprecated.</span> <br /> Allows the profiler to obtain IL-to-native maps by using GetILToNativeMapping. <span style='color: blue; font-weight: bold'>Starting with the .NET Framework 2.0, the runtime always tracks</span> IL-to-native maps; therefore, <span style='color: blue; font-weight: bold'>this flag is always considered to be set. </span> </div><br /> <br /> 하지만, 문서의 내용과는 달리 .NET 2.0 이후에도 여전히 해당 옵션을 명시적으로 설정해줘야 하는 것입니다. 결국, 다음과 같이 ICorProfilerInfo2의 SetEventMask를 설정해 주는 것으로 문제 해결!<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > m_dwEventMask = ...; m_dwEventMask |= COR_PRF_ENABLE_JIT_MAPS; m_pICorProfilerInfo2->SetEventMask(m_dwEventMask); </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1440
(왼쪽의 숫자를 입력해야 합니다.)