Delen via


CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT

De CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT is geïntroduceerd in .NET Framework versie 2.0. .NET Framework 4 retourneert dit HRESULT in twee scenario's:

  • Wanneer een hijacking profiler de registercontext van een thread geforceerd opnieuw instelt op een willekeurig tijdstip, zodat de thread toegang probeert te krijgen tot structuren die niet consistent zijn.

  • Wanneer een profiler een informatieve methode probeert aan te roepen die garbagecollection activeert vanuit een callback-methode die garbagecollection verbiedt.

Deze twee scenario's worden in de volgende secties besproken.

Profilers kapen

(Dit scenario is voornamelijk een probleem met het kapen van profilers, hoewel er gevallen zijn waarin niet-hijacking profilers dit HRESULT kunnen zien.)

In dit scenario stelt een hijacking profiler de registercontext van een thread geforceerd opnieuw in op een willekeurig tijdstip, zodat de thread profilercode kan invoeren of de Common Language Runtime (CLR) opnieuw kan invoeren via een ICorProfilerInfo-methode .

Veel van de id's die de profilerings-API biedt, verwijzen naar gegevensstructuren in de CLR. Veel ICorProfilerInfo aanroepen lezen alleen informatie uit deze gegevensstructuren en geven ze terug. De CLR kan echter dingen in deze structuren wijzigen terwijl deze wordt uitgevoerd, en kan hiervoor vergrendelingen gebruiken. Stel dat de CLR al een vergrendeling vasthield (of probeerde te verkrijgen) op het moment dat de profiler de thread heeft gekaapt. Als de thread de CLR opnieuw opgeeft en probeert meer vergrendelingen te nemen of structuren te inspecteren die werden gewijzigd, hebben deze structuren mogelijk een inconsistente status. Impasses en toegangsschendingen kunnen in dergelijke situaties gemakkelijk optreden.

Over het algemeen geldt dat wanneer een niet-hijacking profiler code uitvoert in een ICorProfilerCallback-methode en een ICorProfilerInfo methode met geldige parameters aanroept, deze niet mag vastlopen of een toegangsschending ontvangen. Profilercode die wordt uitgevoerd in de methode ICorProfilerCallback::ClassLoadFinished kan bijvoorbeeld vragen om informatie over de klasse door de methode ICorProfilerInfo2::GetClassIDInfo2 aan te roepen. De code kan een CORPROF_E_DATAINCOMPLETE HRESULT ontvangen om aan te geven dat informatie niet beschikbaar is. Er wordt echter geen impasse opgetreden en er wordt geen toegangsfout weergegeven. Deze aanroepen in ICorProfilerInfo worden als synchroon beschouwd, omdat ze worden gemaakt op basis van een ICorProfilerCallback methode.

Een beheerde thread die code uitvoert die zich niet binnen een ICorProfilerCallback methode bevindt, wordt echter beschouwd als een asynchrone aanroep. In .NET Framework versie 1 was het moeilijk om te bepalen wat er zou kunnen gebeuren in een asynchrone aanroep. De oproep kan vastlopen, vastlopen of een ongeldig antwoord geven. .NET Framework versie 2.0 heeft enkele eenvoudige controles geïntroduceerd om dit probleem te voorkomen. Als u in .NET Framework 2.0 een onveilige ICorProfilerInfo functie asynchroon aanroept, mislukt deze met een CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Over het algemeen zijn asynchrone aanroepen niet veilig. De volgende methoden zijn echter veilig en ondersteunen specifiek asynchrone aanroepen:

Zie voor meer informatie de vermelding Waarom we CORPROF_E_UNSUPPORTED_CALL_SEQUENCE in de blog CLR Profilerings-API.

Garbagecollections activeren

Dit scenario omvat een profiler die wordt uitgevoerd binnen een callback-methode (bijvoorbeeld een van de ICorProfilerCallback methoden) die garbagecollection verbiedt. Als de profiler probeert een informatieve methode aan te roepen (bijvoorbeeld een methode op de ICorProfilerInfo interface) die een garbagecollection kan activeren, mislukt de informatieve methode met een CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

In de volgende tabel ziet u de callbackmethoden die garbagecollection verbieden, en informatiemethoden die garbagecollection kunnen activeren. Als de profiler wordt uitgevoerd binnen een van de vermelde callbackmethoden en een van de vermelde informatieve methoden aanroept, mislukt die informatieve methode met een CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Callbackmethoden die garbagecollection verbieden Informatieve methoden die garbagecollection activeren
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

Zie ook