CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT는 .NET Framework 버전 2.0에서 도입되었습니다. .NET Framework 버전 4는 다음 두 시나리오에서 이 HRESULT를 반환합니다.
하이재킹 프로파일러가 임의의 시간에 스레드의 레지스터 컨텍스트를 강제로 재설정하여 스레드가 일관성 없는 상태에 있는 구조에 액세스를 시도할 경우.
프로파일러가 가비지 수집을 금지하는 콜백 메서드에서 가비지 수집을 트리거하는 정보 메서드를 호출하려고 시도할 경우.
다음 단원에서는 이러한 두 가지 시나리오를 설명합니다.
하이재킹 프로파일러
(비 하이재킹 프로파일러가 이 HRESULT를 볼 수 있는 경우도 있지만 이 시나리오는 프로파일러 하이재킹 문제를 주로 다룹니다.)
이 시나리오에서는 하이재킹 프로파일러는 스레드가 프로파일러 코드를 입력하거나 ICorProfilerInfo 메서드를 통해 CLR(공통 언어 런타임)을 다시 입력하도록 임의의 시간에서 스레드의 레지스터 컨텍스트를 강제 설정합니다.
프로파일링 API가 제공하는 많은 ID는 CLR에서 데이터 구조를 가리킵니다. 많은 ICorProfilerInfo 호출은 단순히 이러한 데이터 구조에서 정보를 읽고 다시 전달합니다. 그러나 CLR은 실행될 때 이러한 구조를 변경하고 잠금을 사용하여 수행할 수 있습니다. 스레드를 프로파일러 하이재킹한 순간에 CLR이 이미 잠금을 유지(또는 획득을 시도)하고 있다고 가정합니다. 스레드가 CLR에 재진입하고 더 많은 잠금을 시도하거나 수정 중인 프로세스에 있는 구조를 검사하는 경우 이러한 구조는 일관성 없는 상태에 있을 수 있습니다. 교착 상태 및 액세스 위반은 이러한 상황에서 쉽게 발생할 수 있습니다.
일반적으로 비 하이재킹 프로파일러가 ICorProfilerCallback 메서드 내의 코드를 실행하고 올바른 매개 변수를 사용하여 ICorProfilerInfo 메서드를 호출하면 교착 상태가 되거나 액세스 위반을 받지 않아야 합니다. 예를 들어, ICorProfilerCallback::ClassLoadFinished 메서드 내에서 실행되는 프로파일러 코드는 ICorProfilerInfo2::GetClassIDInfo2 메서드를 호출하여 클래스에 대한 정보를 요구할 수 있습니다. 코드는 정보를 사용할 수 있음을 나타내기 위해 CORPROF_E_DATAINCOMPLETE HRESULT를 받을 수 있지만 교착 상태가 되거나 액세스 위반을 받지 않습니다. ICorProfilerInfo에 대한 호출의 이 클래스는 ICorProfilerCallback 메서드에서 이루어지기 때문에 동기식으로 호출됩니다.
그러나 ICorProfilerCallback 메서드 내에 없는 코드를 실행하는 관리되는 스레드는 비동기 호출을 만드는 것으로 간주됩니다. .NET Framework 버전 1에서는 비동기 호출에서 발생할 수 있는 내용을 확인하기 어려웠습니다. 호출은 교착 상태, 손상 또는 잘못된 대답을 제공할 수 있습니다. .NET Framework 버전 2.0에서는 이 문제를 방지하는 데 도움이 되는 몇 가지 간단한 검사가 도입되었습니다. .NET Framework 2.0에서 비동기적으로 안전하지 않은 ICorProfilerInfo 함수를 호출하는 경우 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT로 실패합니다.
일반적으로 비동기 호출은 안전하지 않습니다. 그러나 다음 메서드는 안전하며 비동기 호출을 명시적으로 지원합니다.
자세한 내용은 CLR Profiling API 블로그의 Why we have CORPROF_E_UNSUPPORTED_CALL_SEQUENCE 항목을 참조하십시오.
가비지 수집 트리거
이 시나리오는 가비지 수집을 금지하는 콜백 메서드(예: ICorProfilerCallback 메서드 중 하나) 내에서 실행되는 프로파일러를 포함합니다. 프로파일러가 가비지 수집을 트리거할 수 있는 정보 메서드 호출을 시도하는 경우(예: ICorProfilerInfo 인터페이스에 있는 메서드) 정보 메서드는 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT로 실패합니다.
다음 표는 가비지 수집을 금지하는 콜백 메서드와 가비지 수집을 트리거할 수 있는 정보 메서드를 표시합니다. 프로파일러가 나열된 콜백 메서드 중 하나의 내부에서 실행되고 나열된 정보 메서드 중 하나를 호출하는 경우 해당 정보 메서드는 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT로 실패합니다.
가비지 수집을 금지하는 콜백 메서드 |
가비지 수집을 트리거하는 정보 메서드 |
---|---|