Microsoft MVP성태의 닷넷 이야기
.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363 [링크 복사], [링크+제목 복사],
조회: 22667
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

닷넷 프로파일러의 오류 코드 - 0x80131363

CORPROF_E_UNSUPPORTED_CALL_SEQUENCE (0x80131363) 오류에 대한 좀 더 상세한 정보가 있어서 소개합니다. ^^

Why we have CORPROF_E_UNSUPPORTED_CALL_SEQUENCE
; https://blogs.msdn.microsoft.com/davbr/2008/12/23/why-we-have-corprof_e_unsupported_call_sequence/

정리해 보면, 0x80131363 오류는 CLR 2.0부터 반환하도록 추가되었습니다. 이전에도 언급했지만,

닷넷 프로파일러의 오류 코드 정보
; https://www.sysnet.pe.kr/2/0/10880

0x80131363 오류는 ICorProfilerInfo 관련 메서드를 호출할 때 응용 프로그램이 불안정한 상태로 빠질 경우에 해당하면 반환됩니다. 이 오류는 주로 "hijacking profiler"에서 볼 수 있다고 합니다. (하지만, non-hijacking profiler에서도 발생할 수 있음.) hijacking profiler란? 프로파일러 관련 코드에 진입하기 위해 임의의 시점에 스레드의 레지스터 컨텍스트를 강제로 재설정하거나, 보통 그렇게 진입한 프로파일링 코드에서 ICorProfilerInfo를 이용해 CLR 내부로 재진입하는 종류의 프로파일러입니다.

왜 이것이 문제가 되냐면? 프로파일러가 스레드를 제어하기 시작했을 때 하필 CLR 내부의 자료 구조에 대한 lock을 소유할 경우도 있는데, 이 스레드에서 CLR 내부로 다시 재진입을 하게 되면 또 다른 lock을 가지는 것도 가능하게 되고 결국 deadlock이나 AV(Access Violation)에 쉽게 빠질 수 있다는 것입니다.

CLR 1.x까지는, 위와 같은 상황이 발생하면 '운에 따라' ICorProfilerInfo가 잘 호출될 수도 있고, 또는 deadlock/AV가 발생할 수도 있었지만 CLR 2.0부터는 아예 0x80131363을 반환해서 그런 상황을 미연에 방지하도록 합니다.

일반적으로 ICorProfilerCallback으로 호출되는 메서드 내에서 실행되는 코드로 이뤄진 non-hijacking profiler라면 ICorProfilerInfo 메서드를 호출하는 것은 문제가 없습니다. 예를 들어, ICorProfilerCallback::ClassLoadFinished 콜백 함수 내에서 클래스에 대한 정보를 요청하는 것은 괜찮습니다. 사실 이 시점에 클래스 정보가 완전하지 않아서 구할 수 없는 경우도 있는데 그럼 CORPROF_E_DATAINCOMPLETE를 반환할 뿐 deadlock이나 AV 오류가 발생할 염려는 없습니다. 이런 식으로 안전하게 ICorProfilerInfo를 호출하는 것을 "동기화(synchronous)"되었다고 합니다. 즉, ICorProfilerCallback 콜백 함수 내에서 호출되는 모든 유형은 synchronous에 해당하기 때문에 안전합니다.

반면, ICorProfilerCallback 콜백 함수가 아닌, 관리 스레드 상에서 ICorProfilerInfo가 제공하는 메서드를 호출하면 이를 "비동기화(asynchronous)"되었다고 합니다. 이러한 asynchronous 유형의 호출은 위험하며 CLR 2.0이후부터는 무조건 0x80131363 오류를 반환합니다.

asynchronous 상황에서 ICorProfilerInfo에서 제공하는 메서드들이 대체로 위험하긴 하지만, 다음의 메서드들은 허용된다고 합니다.

  • GetEventMask/SetEventMask
  • GetCurrentThreadID
  • GetThreadContext
  • GetThreadAppDomain
  • GetFunctionFromIP
  • GetFunctionInfo/GetFunctionInfo2
  • GetCodeInfo/GetCodeInfo2
  • GetModuleInfo
  • GetClassIDInfo/GetClassIDInfo2
  • IsArrayClass
  • SetFunctionIDMapper
  • DoStackSnapshot

그 외에 알아둘 점은?

  1. fast-path 방식의 Enter/Leave 콜백 내에서 ICorProfilerInfo 호출은 asynchronous로 간주합니다. (fast-path인지 slow-path인지에 대해서는 "https://blogs.msdn.microsoft.com/davbr/2007/03/22/enter-leave-tailcall-hooks-part-1-the-basics/?WT.mc_id=DT-MVP-4038148" 글을 참조) 반면 slow-path 방식의 Enter/Leave 콜백 내에서는 synchronous로 간주.
  2. 가로채기 된 메서드 내에서 ICorProfilerInfo 호출은 asynchronous로 간주. (예를 들어, 프로파일러가 정의한 함수를 호출하도록 IL 코드를 변경해서 호출되는 경우가 있다면, 프로파일러가 제공한 함수 내에서 ICorProfilerInfo의 함수를 호출하면 안 됨)
  3. FunctionIDMapper 후킹 코드 내에서 ICorProfilerInfo 호출하는 것은 asynchronous로 간주.
  4. 프로파일러 모듈이 직접 만든 스레드가 ICorProfilerInfo를 호출하는 것은 안전하게 synchronous로 간주. 왜냐하면, 그 스레드 상에서 CLR 내부로 재진입하는 등의 작업은 아무런 충돌 위험이 없기 때문.
  5. DoStackSnapshot을 호출한 상황이 synchronous였다면, 그것의 StackSnapshotCallback 콜백 함수 내에서의 ICorProfilerInfo 호출은 안전하게 synchronous로 간주.





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







[최초 등록일: ]
[최종 수정일: 11/8/2016]

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

비밀번호

댓글 작성자
 




... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12698정성태7/7/202121476오류 유형: 732. Windows 11 업데이트 시 3% 또는 0%에서 다운로드가 멈춘 경우
12697정성태7/7/202116070개발 환경 구성: 574. Windows 11 (Insider Preview) 설치하는 방법
12696정성태7/6/202117428VC++: 146. 운영체제의 스레드 문맥 교환(Context Switch)을 유사하게 구현하는 방법파일 다운로드2
12695정성태7/3/202117604VC++: 145. C 언어의 setjmp/longjmp 기능을 Thread Context를 이용해 유사하게 구현하는 방법파일 다운로드1
12694정성태7/2/202119223Java: 24. Azure - Spring Boot 앱을 Java SE(Embedded Web Server)로 호스팅 시 로그 파일 남기는 방법 [1]
12693정성태6/30/202116224오류 유형: 731. Azure Web App Site Extension - Failed to install web app extension [...]. {1}
12692정성태6/30/202116864디버깅 기술: 180. Azure - Web App의 비정상 종료 시 남겨지는 로그 확인
12691정성태6/30/202116783개발 환경 구성: 573. 테스트 용도이지만 테스트에 적합하지 않은 Azure D1 공유(shared) 요금제
12690정성태6/28/202117669Java: 23. Azure - 자바(Java)로 만드는 Web App Service - Tomcat 호스팅
12689정성태6/25/202120060오류 유형: 730. Windows Forms 디자이너 - The class Form1 can be designed, but is not the first class in the file. [1]
12688정성태6/24/202119334.NET Framework: 1073. C# - JSON 역/직렬화 시 리플렉션 손실을 없애는 JsonSrcGen [2]파일 다운로드1
12687정성태6/22/202116481오류 유형: 729. Invalid data: Invalid artifact, java se app service only supports .jar artifact
12686정성태6/21/202117776Java: 22. Azure - 자바(Java)로 만드는 Web App Service - Java SE (Embedded Web Server) 호스팅
12685정성태6/21/202119825Java: 21. Azure Web App Service에 배포된 Java 프로세스의 메모리 및 힙(Heap) 덤프 뜨는 방법
12684정성태6/19/202118109오류 유형: 728. Visual Studio 2022부터 DTE.get_Properties 속성 접근 시 System.MissingMethodException 예외 발생
12683정성태6/18/202118802VS.NET IDE: 166. Visual Studio 2022 - Windows Forms 프로젝트의 x86 DLL 컨트롤이 Designer에서 오류가 발생하는 문제 [1]파일 다운로드1
12682정성태6/18/202115274VS.NET IDE: 165. Visual Studio 2022를 위한 Extension 마이그레이션
12681정성태6/18/202116178오류 유형: 727. .NET 2.0 ~ 3.5 + x64 환경에서 System.EnterpriseServices 참조 시 CS8012 경고
12680정성태6/18/202118221오류 유형: 726. python2.7.exe 실행 시 0xc000007b 오류
12679정성태6/18/202117897COM 개체 관련: 23. CoInitializeSecurity의 전역 설정을 재정의하는 CoSetProxyBlanket 함수 사용법파일 다운로드1
12678정성태6/17/202116150.NET Framework: 1072. C# - CoCreateInstance 관련 Inteop 오류 정리파일 다운로드1
12677정성태6/17/202119710VC++: 144. 역공학을 통한 lxssmanager.dll의 ILxssSession 사용법 분석파일 다운로드1
12676정성태6/16/202118517VC++: 143. ionescu007/lxss github repo에 공개된 lxssmanager.dll의 CLSID_LxssUserSession/IID_ILxssSession 사용법파일 다운로드1
12675정성태6/16/202116744Java: 20. maven package 명령어 결과물로 (war가 아닌) jar 생성 방법
12674정성태6/15/202117714VC++: 142. DEFINE_GUID 사용법
12673정성태6/15/202117925Java: 19. IntelliJ - 자바(Java)로 만드는 Web App을 Tomcat에서 실행하는 방법
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...