Microsoft MVP성태의 닷넷 이야기
.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363 [링크 복사], [링크+제목 복사],
조회: 15054
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  38  [39]  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12662정성태6/8/20218282.NET Framework: 1064. C# COM 개체를 PIA(Primary Interop Assembly)로써 "Embed Interop Types" 참조하는 방법파일 다운로드1
12661정성태6/4/202118983.NET Framework: 1063. C# - MQTT를 이용한 클라이언트/서버(Broker) 통신 예제 [4]파일 다운로드1
12660정성태6/3/202110114.NET Framework: 1062. Windows Forms - 폼 내에서 발생하는 마우스 이벤트를 자식 컨트롤 영역에 상관없이 수신하는 방법 [1]파일 다운로드1
12659정성태6/2/202111349Linux: 40. 우분투 설치 후 MBR 디스크 드라이브 여유 공간이 인식되지 않은 경우 - Logical Volume Management
12658정성태6/2/20218776Windows: 194. Microsoft Store에 있는 구글의 공식 Youtube App
12657정성태6/2/202110050Windows: 193. 윈도우 패키지 관리자 - winget 설치
12656정성태6/1/20218297.NET Framework: 1061. 서버 유형의 COM+에 적용할 수 없는 Server GC
12655정성태6/1/20217775오류 유형: 722. windbg/sos - savemodule - Fail to read memory
12654정성태5/31/20217797오류 유형: 721. Hyper-V - Saved 상태의 VM을 시작 시 오류 발생
12653정성태5/31/202110488.NET Framework: 1060. 닷넷 GC에 새롭게 구현되는 DPAD(Dynamic Promotion And Demotion for GC)
12652정성태5/31/20218597VS.NET IDE: 164. Visual Studio - Web Deploy로 Publish 시 암호창이 매번 뜨는 문제
12651정성태5/31/20218851오류 유형: 720. PostgreSQL - ERROR: 22P02: malformed array literal: "..."
12650정성태5/17/20218157기타: 82. OpenTabletDriver의 버튼에 더블 클릭을 매핑 및 게임에서의 지원 방법
12649정성태5/16/20219476.NET Framework: 1059. 세대 별 GC(Garbage Collection) 방식에서 Card table의 사용 의미 [1]
12648정성태5/16/20218130사물인터넷: 66. PC -> FTDI -> NodeMCU v1 ESP8266 기기를 UART 핀을 연결해 직렬 통신하는 방법파일 다운로드1
12647정성태5/15/20219383.NET Framework: 1058. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용파일 다운로드1
12646정성태5/15/20218528사물인터넷: 65. C# - Arduino IDE의 Serial Monitor 기능 구현파일 다운로드1
12645정성태5/14/20218205사물인터넷: 64. NodeMCU v1 ESP8266 - LittleFS를 이용한 와이파이 접속 정보 업데이트파일 다운로드1
12644정성태5/14/20219359오류 유형: 719. 윈도우 - 제어판의 "프로그램 및 기능" / "Windows 기능 켜기/끄기" 오류 0x800736B3
12643정성태5/14/20218548오류 유형: 718. 서버 유형의 COM+ 사용 시 0x80080005(Server execution failed) 오류 발생
12642정성태5/14/20219477오류 유형: 717. The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
12641정성태5/13/20219181디버깅 기술: 179. 윈도우용 .NET Core 3 이상에서 Windbg의 sos 사용법
12640정성태5/13/202112113오류 유형: 716. RDP 연결 - Because of a protocol error (code: 0x112f), the remote session will be disconnected. [1]
12639정성태5/12/20219011오류 유형: 715. Arduino: Open Serial Monitor - The module '...\detection.node' was compiled against a different Node.js version using NODE_MODULE_VERSION
12638정성태5/12/20219917사물인터넷: 63. NodeMCU v1 ESP8266 - 펌웨어 내 파일 시스템(SPIFFS, LittleFS) 및 EEPROM 활용
12637정성태5/10/20219502사물인터넷: 62. NodeMCU v1 ESP8266 보드의 A0 핀에 다중 아날로그 센서 연결 [1]
... 31  32  33  34  35  36  37  38  [39]  40  41  42  43  44  45  ...