Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

ICorProfilerInfo::GetILToNativeMapping 메서드가 0x80131358을 반환하는 경우

아래의 예제 코드가 있음에도 불구하고,

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

제 경우에는 GetILToNativeMapping 메서드를 아무리 호출해도 0x80131358 값만을 반환하는 군요. ^^;

ULONG32 cNeedMap = 1024;
COR_DEBUG_IL_TO_NATIVE_MAP zeroBuf[1024];

cNeedMap = 0;
hr = pInfo->GetILToNativeMapping(funcId, 0, &cNeedMap, NULL);

// hr == 0x80131358

Error Lookup 프로그램에서 0x80131358 값이 뭔지 조회해도 그런 값을 찾을 수 없다고 나옵니다.

그러다가, 혹시 SSCLI에서 이 답을 구할 수 도 있지 않을까 싶었는데요.

shared-source-cli-2.0 / clr / src / vm / proftoeeinterfaceimpl.cpp
; https://github.com/gbarnett/shared-source-cli-2.0/blob/master/clr/src/vm/proftoeeinterfaceimpl.cpp

GetILToNativeMapping 구현 코드에서 오류로 인해 중간에 return 하는 것을 보니 답이 나옵니다. 바로 CORPROF_E_JITMAPS_NOT_ENABLED의 값이었던 것입니다.

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         return (CORPROF_E_JITMAPS_NOT_ENABLED); 
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 } 

이 값의 정의는 Visual C++의 CorError.h 헤더 파일에서 찾을 수 있습니다.

#define CORPROF_E_JITMAPS_NOT_ENABLED EMAKEHR(0x1358)

CORPROF_E_JITMAPS_NOT_ENABLED의 원인은 .NET Profiler를 만져본 분들이라면 금방 눈치챌 수 있습니다. .NET Profiler는 callback 이벤트를 받을 유형을 지정할 수가 있는데요. 제 경우에는 해당 옵션을 활성화시키지 않았기 때문이었습니다. 그 옵션의 이름은 COR_PRF_MONITOR::COR_PRF_ENABLE_JIT_MAPS입니다.

COR_PRF_MONITOR Enumeration
; https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/cor-prf-monitor-enumeration

재미있는 것은 문서의 내용입니다. 위의 글에 보면 COR_PRF_ENABLE_JIT_MAPS 옵션에 다음과 같은 내용이 있습니다.

Deprecated.
Allows the profiler to obtain IL-to-native maps by using GetILToNativeMapping. Starting with the .NET Framework 2.0, the runtime always tracks IL-to-native maps; therefore, this flag is always considered to be set.


하지만, 문서의 내용과는 달리 .NET 2.0 이후에도 여전히 해당 옵션을 명시적으로 설정해줘야 하는 것입니다. 결국, 다음과 같이 ICorProfilerInfo2의 SetEventMask를 설정해 주는 것으로 문제 해결!

m_dwEventMask = ...;
m_dwEventMask |= COR_PRF_ENABLE_JIT_MAPS;

m_pICorProfilerInfo2->SetEventMask(m_dwEventMask);




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/17/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...
NoWriterDateCnt.TitleFile(s)
13291정성태3/20/20235004.NET Framework: 2104. C# Windows Forms - WndProc 재정의와 IMessageFilter 사용 시의 차이점
13290정성태3/19/20234514.NET Framework: 2103. C# - 윈도우에서 기본 제공하는 FindText 대화창 사용법파일 다운로드1
13289정성태3/18/20233729Windows: 231. Win32 - 대화창 템플릿의 2진 리소스를 읽어들여 자식 윈도우를 생성하는 방법파일 다운로드1
13288정성태3/17/20233845Windows: 230. Win32 - 대화창의 DLU 단위를 pixel로 변경하는 방법파일 다운로드1
13287정성태3/16/20234014Windows: 229. Win32 - 대화창 템플릿의 2진 리소스를 읽어들여 윈도우를 직접 띄우는 방법파일 다운로드1
13286정성태3/15/20234458Windows: 228. Win32 - 리소스에 포함된 대화창 Template의 2진 코드 해석 방법
13285정성태3/14/20234017Windows: 227. Win32 C/C++ - Dialog Procedure를 재정의하는 방법파일 다운로드1
13284정성태3/13/20234259Windows: 226. Win32 C/C++ - Dialog에서 값을 반환하는 방법파일 다운로드1
13283정성태3/12/20233748오류 유형: 852. 파이썬 - TypeError: coercing to Unicode: need string or buffer, NoneType found
13282정성태3/12/20234063Linux: 58. WSL - nohup 옵션이 필요한 경우
13281정성태3/12/20234061Windows: 225. 윈도우 바탕화면의 아이콘들이 넓게 퍼지는 경우 [2]
13280정성태3/9/20234789개발 환경 구성: 670. WSL 2에서 호스팅 중인 TCP 서버를 외부에서 접근하는 방법
13279정성태3/9/20234282오류 유형: 851. 파이썬 ModuleNotFoundError: No module named '_cffi_backend'
13278정성태3/8/20234308개발 환경 구성: 669. WSL 2의 (init이 아닌) systemd 지원 [1]
13277정성태3/6/20234981개발 환경 구성: 668. 코드 사인용 인증서 신청 및 적용 방법(예: Digicert)
13276정성태3/5/20234677.NET Framework: 2102. C# 11 - ref struct/ref field를 위해 새롭게 도입된 scoped 예약어
13275정성태3/3/20234918.NET Framework: 2101. C# 11의 ref 필드 설명
13274정성태3/2/20234520.NET Framework: 2100. C# - ref 필드로 ref struct 타입을 허용하지 않는 이유
13273정성태2/28/20234258.NET Framework: 2099. C# - 관리 포인터로서의 ref 예약어 의미
13272정성태2/27/20234486오류 유형: 850. SSMS - mdf 파일을 Attach 시킬 때 Operating system error 5: "5(Access is denied.)" 에러
13271정성태2/25/20234468오류 유형: 849. Sql Server Configuration Manager가 시작 메뉴에 없는 경우
13270정성태2/24/20234001.NET Framework: 2098. dotnet build에 /p 옵션을 적용 시 유의점
13269정성태2/23/20234638스크립트: 46. 파이썬 - uvicorn의 콘솔 출력을 UDP로 전송
13268정성태2/22/20235135개발 환경 구성: 667. WSL 2 내부에서 열고 있는 UDP 서버를 호스트 측에서 접속하는 방법
13267정성태2/21/20235000.NET Framework: 2097. C# - 비동기 소켓 사용 시 메모리 해제가 finalizer 단계에서 발생하는 사례파일 다운로드1
13266정성태2/20/20234651오류 유형: 848. .NET Core/5+ - Process terminated. Couldn't find a valid ICU package installed on the system
1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...