Partilhar via


invalidCERCall MDA

The invalidCERCall Assistente de depuração gerenciada (MDA) é ativado quando há uma telefonar dentro do gráfico de região (CER) de execução restrita a um método que não há Contrato de confiabilidade ou um contrato fraco excessivamente. Um contrato fraco é um contrato que declara que o dano de estado caso pior é do escopo maior que a instância passada para a telefonar, isto é, a AppDomain ou estado de processo pode estar corrompido ou que seu resultado não é sempre deterministicamente computáveis quando chamado dentro de uma CER.

Sintomas

Resultados inesperados ao executar o código em uma CER.Os sintomas não são específicos.Ele pode estar um inesperado OutOfMemoryException, um ThreadAbortException, ou Outros exceções na telefonar para o método não é confiável porque o time de execução não prepará-lo antecipadamente ou protegê-lo de ThreadAbortException exceções em time de execução. É uma ameaça maior do que qualquer exceção resultante do método em time de execução pode deixar o AppDomain ou processo em um estado instável, o que contraria o objetivo de uma CER. O motivo que é criada uma CER é evitar danos de estado, sistema autônomo.Os sintomas de estado corrompido são específicos do aplicativo porque a definição de um estado consistente é diferente entre os aplicativos.

Causa

Código dentro de uma CER está chamando uma função com nenhuma ReliabilityContractAttribute ou com um fraco ReliabilityContractAttribute não é compatível com executando em uma 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, MayCorruptAppDomain, ou None. Qualquer uma dessas condições indica que o código de chamada pode impedir os esforços do código da CER para manter um estado consistente.sistema autônomo CERs permitir código tratar erros de uma forma muito determinista, manutenção constantes internas que são importantes para o aplicativo e permitindo que ele continue em execução na face de erros transitórios, sistema autônomo exceções de memória insuficiente.

A ativação deste MDA indica a possibilidade do método sendo chamado no CER pode falhar de modo que o chamador não esperava ou que deixa o AppDomain ou processar estado irrecuperável ou corrompido. Obviamente, o código de chamada pode executar corretamente e o problema é simplesmente um contrato está faltando.No entanto, os problemas envolvidos na escrever código confiável são sutis e ausência de um contrato é um mercadoria indicador que o código não pode ser executado corretamente.Os contratos são indicadores que o programador tem codificado com confiança e também promete que essas garantias não mudarão no futuro revisões do código.Ou seja, os contratos são declarações de intenções e não apenas os detalhes de implementação.

Como qualquer método com um contrato fraco ou inexistente potencialmente pode falhar de várias formas imprevisíveis, o tempo de execução não tenta remover qualquer um dos seus próprios falhas imprevisíveis do método introduzidas pela lazy-compilação JIT, população de dicionário genéricas, ou anulações de thread, por exemplo.Isto é, quando este MDA é ativado, ele indica que o tempo de execução não incluiu o método chamado na CER que está sendo definida; o gráfico de telefonar foi encerrado neste nó porque continua a preparar esta subárvore ajudaria a possível erro de máscara.

Resolução

Adicionar um contrato de confiabilidade válido para a função ou evitar usar aquela telefonar de função.

Efeito sobre o tempo de execução

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

Saída

A seguir é um exemplo de saída 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

Conceitos

Diagnosticar erros com assistentes de depuração gerenciadas

Referência

PrepareMethod

System.Runtime.ConstrainedExecution