Sdílet prostřednictvím


CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT

CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT byl představen v rozhraní .NET Framework verze 2.0. Rozhraní .NET Framework 4 vrátí tuto hodnotu HRESULT ve dvou scénářích:

  • Když napadený profiler vynuceně resetuje kontext registru vlákna v libovolném čase tak, aby se vlákno pokusilo získat přístup ke strukturám, které jsou v nekonzistentním stavu.

  • Když se profiler pokusí volat informační metodu, která aktivuje uvolňování paměti z metody zpětného volání, která zakazuje uvolňování paměti.

Tyto dva scénáře jsou popsány v následujících částech.

Napadení profilátorů

(Tento scénář je primárně problémem s napadením profilátorů, i když existují případy, kdy se tato hodnota HRESULT může zobrazit u jiných než napadených profilátorů.)

V tomto scénáři zneužití profiler vynuceně resetuje kontext registru vlákna v libovolném okamžiku tak, aby vlákno může zadat kód profileru nebo znovu zadat common language runtime (CLR) prostřednictvím metody ICorProfilerInfo .

Řada ID, která poskytuje rozhraní API pro profilaci, odkazuje na datové struktury v MODULU CLR. Mnoho ICorProfilerInfo volání pouze čte informace z těchto datových struktur a předává je zpět. ClR však může měnit věci v těchto strukturách při spuštění a může k tomu používat zámky. Předpokládejme, že modul CLR již držel (nebo se pokoušel získat) zámek v době, kdy profiler přepadl vlákno. Pokud vlákno znovu zadá CLR a pokusí se převzít více zámků nebo zkontrolovat struktury, které byly v procesu úpravy, tyto struktury mohou být v nekonzistentním stavu. V takových situacích může snadno dojít k zablokování a narušení přístupu.

Obecně platí, že když profiler, který neunese, spustí kód uvnitř metody ICorProfilerCallback a volá metodu ICorProfilerInfo s platnými parametry, neměl by se zablokovat nebo obdržet narušení přístupu. Například profiler kód, který běží uvnitř ICorProfilerCallback::ClassLoadFinished metoda může požádat o informace o třídě voláníM ICorProfilerInfo2::GetClassIDInfo2 metoda. Kód může obdržet CORPROF_E_DATAINCOMPLETE HRESULT, která značí, že informace nejsou k dispozici. Nebude se ale zablokovat ani nebude narušovat přístup. Tato volání jsou ICorProfilerInfo považována za synchronní, protože jsou tvořena metodou ICorProfilerCallback .

Spravované vlákno, které spouští kód, který není v rámci ICorProfilerCallback metody, se však považuje za asynchronní volání. V rozhraní .NET Framework verze 1 bylo obtížné určit, co by se mohlo stát při asynchronním volání. Hovor může být vzájemným zablokováním, chybou nebo poskytnutím neplatné odpovědi. Rozhraní .NET Framework verze 2.0 zavedlo několik jednoduchých kontrol, které vám pomůžou vyhnout se tomuto problému. Pokud v rozhraní .NET Framework 2.0 zavoláte nebezpečnou ICorProfilerInfo funkci asynchronně, selže s CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Obecně platí, že asynchronní volání nejsou bezpečná. Následující metody jsou však bezpečné a konkrétně podporují asynchronní volání:

Další informace najdete v položce Proč máme CORPROF_E_UNSUPPORTED_CALL_SEQUENCE v blogu rozhraní API pro profilaci CLR.

Aktivace uvolňování paměti

Tento scénář zahrnuje profiler spuštěný uvnitř metody zpětného volání (například jedné z ICorProfilerCallback metod), která zakazuje uvolňování paměti. Pokud se profiler pokusí volat informační metodu (například metodu v ICorProfilerInfo rozhraní), která může aktivovat uvolňování paměti, informační metoda selže s CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Následující tabulka obsahuje metody zpětného volání, které zakazují uvolňování paměti, a informační metody, které mohou aktivovat uvolňování paměti. Pokud profiler spustí v jedné z uvedených metod zpětného volání a zavolá jednu z uvedených informačních metod, tato informační metoda selže s CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Metody zpětného volání, které zakazují uvolňování paměti Informační metody, které aktivují uvolňování paměti
ThreadAssignedToOSThread

ExceptionUnwindFunctionEnter

ExceptionUnwindFunctionLeave

ExceptionUnwindFinallyEnter

ExceptionUnwindFinallyLeave

ExceptionCatcherEnter

RuntimeSuspendStarted

Modul runtimeSuspendFinished

RuntimeSuspendAborted

RuntimeThreadSuspended

RuntimeThreadResumed

Přesunuté odkazy

Odkazy na objekty

ObjectsAllocatedByClass

Kořenové odkazy2

PopisovačCreated

HandleDestroyed

GarbageCollectionStarted

GarbageCollectionFinished
GetILFunctionBodyAllocator

SetILFunctionBody

SetILInstrumentedCodeMap

Vynucené uvolňování paměti

GetClassFromToken

GetClassFromTokenAndTypeArgs

GetFunctionFromTokenAndTypeArgs

GetAppDomainInfo

EnumModules

RequestProfilerDetach

GetAppDomainsContainingModule

Viz také