다음을 통해 공유


CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT

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 프로파일링 API 블로그에서 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE가 있는 이유 항목을 참조하세요.

가비지 수집 트리거

이 시나리오에는 가비지 수집을 금지하는 콜백 메서드(예: ICorProfilerCallback 메서드 중 하나) 내에서 실행되는 프로파일러가 포함됩니다. 프로파일러가 가비지 수집을 트리거할 수 있는 정보 메서드(예: ICorProfilerInfo 인터페이스의 메서드)를 호출하려고 하면 정보 메서드가 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT와 함께 실패합니다.

다음 표에는 가비지 수집을 금지하는 콜백 메서드와 가비지 수집을 트리거할 수 있는 정보 메서드가 나와 있습니다. 나열된 콜백 메서드 중 하나 내에서 프로파일러가 실행되고 나열된 정보 메서드 중 하나를 호출하면 해당 정보 메서드가 CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT와 함께 실패합니다.

가비지 수집을 금지하는 콜백 메서드 가비지 수집을 트리거하는 정보 메서드
ThreadAssignedToOSThread

ExceptionUnwindFunctionEnter

ExceptionUnwindFunctionLeave

ExceptionUnwindFinallyEnter

ExceptionUnwindFinallyLeave

ExceptionCatcherEnter

RuntimeSuspendStarted

RuntimeSuspendFinished

RuntimeSuspendAborted

RuntimeThreadSuspended

RuntimeThreadResumed

MovedReferences

ObjectReferences

ObjectsAllocatedByClass

RootReferences2

HandleCreated

HandleDestroyed

GarbageCollectionStarted

GarbageCollectionFinished
GetILFunctionBodyAllocator

SetILFunctionBody

SetILInstrumentedCodeMap

ForceGC

GetClassFromToken

GetClassFromTokenAndTypeArgs

GetFunctionFromTokenAndTypeArgs

GetAppDomainInfo

EnumModules

RequestProfilerDetach

GetAppDomainsContainingModule

참고 항목