Partilhar via


inválidoCERCall MDA

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O invalidCERCall assistente de depuração gerenciado (MDA) é ativado quando há uma chamada dentro do gráfico de região de execução restrita (CER) para um método que não tem contrato de confiabilidade ou um contrato excessivamente fraco. Um contrato fraco é um contrato que declara que o pior caso de corrupção de estado é de maior alcance do que a instância passada para a chamada, ou seja, o AppDomain estado ou processo pode ficar corrompido ou que seu resultado nem sempre é deterministicamente computável quando chamado dentro de um CER.

Sintomas

Resultados inesperados ao executar código em um CER. Os sintomas não são específicos. Eles podem ser um inesperado OutOfMemoryException, um ThreadAbortExceptionou outras exceções na chamada para o método não confiável porque o tempo de execução não o preparou com antecedência ou o protegeu de exceções em tempo de ThreadAbortException execução. Uma ameaça maior é que qualquer exceção resultante do método em tempo de execução poderia deixar o AppDomain processo em um estado instável, o que é contrário ao objetivo de um CER. A razão pela qual uma CER é criada é para evitar corrupções estatais como esta. Os sintomas de estado corrompido são específicos do aplicativo porque a definição de estado consistente é diferente entre os aplicativos.

Motivo

Código dentro de um CER está chamando uma função sem ReliabilityContractAttribute ou com um fraco ReliabilityContractAttribute que não é compatível com a execução em um CER.

Em termos de sintaxe de contrato de confiabilidade, um contrato fraco é um contrato que não especifica um Consistency valor de enumeração ou especifica um Consistency valor de MayCorruptProcess, MayCorruptAppDomainou None. Qualquer uma dessas condições indica que o código chamado pode impedir os esforços do outro código no CER para manter um estado consistente. Os CERs permitem que o código trate erros de uma maneira muito determinística, mantendo invariantes internas que são importantes para o aplicativo e permitindo que ele continue sendo executado em face de erros transitórios, como exceções de falta de memória.

A ativação deste MDA indica uma possibilidade de o método que está sendo chamado no CER pode falhar de uma forma que o chamador não esperava ou que deixa o AppDomain estado do processo corrompido ou irrecuperável. Claro, o código chamado pode ser executado corretamente e o problema é simplesmente um contrato ausente. No entanto, os problemas envolvidos na escrita de código confiável são sutis e a ausência de um contrato é um bom indicador de que o código pode não ser executado corretamente. Os contratos são indicadores de que o programador codificou de forma confiável e também promete que essas garantias não mudarão em futuras revisões do código. Ou seja, os contratos são declarações de intenções e não apenas detalhes de implementação.

Como qualquer método com um contrato fraco ou inexistente pode potencialmente falhar de muitas maneiras imprevisíveis, o tempo de execução não tenta remover nenhuma de suas próprias falhas imprevisíveis do método que são introduzidas por compilações JIT preguiçosas, população de dicionários genéricos ou abortamentos de threads, por exemplo. Ou seja, quando este MDA é ativado, indica que o tempo de execução não incluiu o método chamado no CER que está sendo definido; O gráfico de chamada foi encerrado neste nó porque continuar a preparar esta subárvore ajudaria a mascarar o erro potencial.

Resolução

Adicione um contrato de confiabilidade válido à função ou evite usar essa chamada de função.

Efeito no tempo de execução

O efeito de chamar um contrato fraco de uma CER pode ser a falha da CER em concluir suas operações. Isso poderia levar à corrupção do AppDomain estado do processo.

Saída

A seguir está a saída de exemplo deste MDA.

Method 'MethodWithCer', while executing within a constrained execution region, makes a call at IL offset 0x000C to 'MethodWithWeakContract', which does not have a sufficiently strong reliability contract and might cause non-deterministic results.

Configuração

<mdaConfig>
  <assistants>
    <invalidCERCall />
  </assistants>
</mdaConfig>

Consulte também