Partilhar via


CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT

A CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT foi introduzida no .NET Framework versão 2.0. .NET Framework 4 devolve este HRESULT em dois cenários:

  • Quando um gerador de perfis de sequestro repõe à força o contexto de registo de um thread num momento arbitrário para que o thread tente aceder a estruturas que estão num estado inconsistente.

  • Quando um gerador de perfis tenta chamar um método informativo que aciona a libertação da memória a partir de um método de chamada de retorno que proíbe a libertação da memória.

Estes dois cenários são abordados nas secções seguintes.

Hijacking Profilers

(Este cenário é principalmente um problema com a hijacking profilers, embora existam casos em que os geradores de perfis não hijacking podem ver este HRESULT.)

Neste cenário, um gerador de perfis de hijacking repõe à força o contexto de registo de um thread num momento arbitrário para que o thread possa introduzir o código do gerador de perfis ou reintroduzir o runtime de linguagem comum (CLR) através de um método ICorProfilerInfo .

Muitos dos IDs que a API de criação de perfis fornece apontam para estruturas de dados no CLR. Muitas ICorProfilerInfo chamadas apenas leem informações destas estruturas de dados e transmitem-nas de volta. No entanto, o CLR pode alterar as coisas nessas estruturas à medida que é executada e pode utilizar bloqueios para o fazer. Suponha que o CLR já tinha (ou estava a tentar adquirir) um bloqueio no momento em que o gerador de perfis sequestrou o thread. Se o thread reentra no CLR e tentar obter mais bloqueios ou inspecionar estruturas que estavam em processo de modificação, estas estruturas poderão estar num estado inconsistente. Os impasses e as violações de acesso podem ocorrer facilmente nestas situações.

Em geral, quando um gerador de perfis não hijacking executa código dentro de um método ICorProfilerCallback e chama para um ICorProfilerInfo método com parâmetros válidos, não deve bloquear ou receber uma violação de acesso. Por exemplo, o código do gerador de perfis que é executado no método ICorProfilerCallback::ClassLoadFinished pode pedir informações sobre a classe ao chamar o método ICorProfilerInfo2::GetClassIDInfo2 . O código pode receber um CORPROF_E_DATAINCOMPLETE HRESULT para indicar que as informações não estão disponíveis. No entanto, não irá bloquear ou receber uma violação de acesso. Estas chamadas ICorProfilerInfo são consideradas síncronas, uma vez que são feitas a partir de um ICorProfilerCallback método.

No entanto, considera-se que um thread gerido que executa código que não está dentro de um ICorProfilerCallback método está a fazer uma chamada assíncrona. No .NET Framework versão 1, era difícil determinar o que poderia acontecer numa chamada assíncrona. A chamada pode bloquear, falhar ou dar uma resposta inválida. .NET Framework versão 2.0 introduziu algumas verificações simples para o ajudar a evitar este problema. No .NET Framework 2.0, se chamar uma função não segura ICorProfilerInfo de forma assíncrona, esta falha com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Em geral, as chamadas assíncronas não são seguras. No entanto, os seguintes métodos são seguros e suportam especificamente chamadas assíncronas:

Para obter mais informações, veja a entrada Por que temos CORPROF_E_UNSUPPORTED_CALL_SEQUENCE no blogue da API de Criação de Perfis do CLR.

Acionar Libertações da Memória

Este cenário envolve um gerador de perfis que está a ser executado dentro de um método de chamada de retorno (por exemplo, um dos métodos) que proíbe a ICorProfilerCallback libertação da memória. Se o gerador de perfis tentar chamar um método informativo (por exemplo, um método na interface) que possa acionar ICorProfilerInfo uma libertação da memória, o método informativo falha com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

A tabela seguinte apresenta os métodos de chamada de retorno que proíbem as libertações da memória e os métodos informativos que podem acionar libertações da memória. Se o gerador de perfis executar dentro de um dos métodos de chamada de retorno listados e chamar um dos métodos informativos listados, esse método informativo falhará com um CORPROF_E_UNSUPPORTED_CALL_SEQUENCE HRESULT.

Métodos de chamada de retorno que proíbem libertações de lixo Métodos informativos que acionam libertações de lixo
ThreadAssignedToOSThread

ExceptionUnwindFunctionEnter

ExceptionUnwindFunctionLeave

ExceptionUnwindFinallyEnter

ExceptionUnwindFinallyLeave

ExceptionCatcherEnter

RuntimeSuspendStarted

RuntimeSuspendFinished

RuntimeSuspendAborted

RuntimeThreadSuspended

RuntimeThreadResumed

MovedReferences

ObjectReferences

ObjectsAllocatedByClass

RootReferences2

IdentificadorCriado

HandleDestroyed

GarbageCollectionStarted

GarbageCollectionFinished
GetILFunctionBodyAllocator

SetILFunctionBody

SetILInstrumentedCodeMap

ForceGC

GetClassFromToken

GetClassFromTokenAndTypeArgs

GetFunctionFromTokenAndTypeArgs

GetAppDomainInfo

EnumModules

RequestProfilerDetach

GetAppDomainsContainingModule

Ver também