Condividi tramite


MDA invalidCERCall

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

L'assistente al debug gestito invalidCERCall viene attivato quando all'interno del grafico delle aree a esecuzione vincolata è presente una chiamata a un metodo che non include alcun contratto di affidabilità o che include un contratto eccessivamente debole. Un contratto debole è un contratto che dichiara che il peggior stato di danneggiamento ha un ambito più vasto rispetto all'istanza passata alla chiamata, ovvero lo stato di AppDomain o del processo può risultare danneggiato o il risultato non è sempre calcolabile in modo deterministico quando la chiamata avviene all'interno di un'area a esecuzione vincolata.

Sintomi

Risultati imprevisti durante l'esecuzione di codice in un'area a esecuzione vincolata. I sintomi non sono specifici. Potrebbero comprendere un'eccezione OutOfMemoryException non prevista, un'eccezione ThreadAbortException o altre eccezioni nella chiamata nel metodo non affidabile, che non è stato preparato in anticipo o protetto da eccezioni ThreadAbortException in fase di esecuzione dal runtime. Una minaccia maggiore è costituita dal fatto che qualsiasi eccezione risultante dal metodo in fase di esecuzione può lasciare AppDomain o il processo in uno stato instabile, che è un comportamento opposto agli obiettivi di un'area a esecuzione vincolata. Il motivo della creazione di un'area a esecuzione vincolata è evitare danneggiamenti dello stato come questo. I sintomi di uno stato danneggiato sono specifici dell'applicazione, perché la definizione di stato coerente varia a seconda dell'applicazione.

Causa

Il codice all'interno di un'area a esecuzione vincolata chiama una funzione senza ReliabilityContractAttribute o con un oggetto ReliabilityContractAttribute debole, che non è compatibile con l'esecuzione in un'area a esecuzione vincolata.

In termini di sintassi del contratto di affidabilità, un contratto debole è un contratto che non specifica un valore di enumerazione Consistency o che specifica il valore di Consistency come MayCorruptProcess, MayCorruptAppDomain o None. Tutte queste condizioni indicano che il codice chiamato può impedire i tentativi di altro codice nell'area a esecuzione vincolata di mantenere uno stato coerente. Le aree a esecuzione vincolata permettono al codice di gestire gli errori in modo molto deterministico, mantenendo le invarianti interne importanti per l'applicazione e consentendo l'esecuzione continua del codice anche in caso di errori temporanei come le eccezioni di memoria insufficiente.

L'attivazione di questo assistente al debug gestito indica la possibilità che il metodo chiamato nell'area a esecuzione vincolata possa non riuscire con un comportamento imprevisto per il chiamante o in modo da lasciare lo stato di AppDomain o del processo danneggiato o non ripristinabile. Naturalmente, è possibile che il codice chiamato venga eseguito correttamente e che il problema sia semplicemente un contratto mancante. Tuttavia, i problemi correlati alla scrittura di codice affidabile sono impercettibili e l'assenza di un contratto è un buon indicatore del rischio che il codice non venga eseguito correttamente. I contratti sono indicatori del fatto che il programmatore ha creato il codice in modo affidabile e lasciano presupporre che queste garanzie resteranno immutate nelle versioni successive del codice. Questo significa che i contratti sono dichiarazioni di intenti e non solo dettagli di implementazione.

Poiché qualsiasi metodo con un contratto debole o inesistente può non riuscire in molti modi imprevisti, il runtime non tenta di rimuovere alcuno degli errori imprevisti dal metodo, introdotti, ad esempio, da una compilazione JIT inefficace, dal popolamento di dizionari di generics o da interruzioni dei thread. Di conseguenza, quando questo assistente al debug gestito viene attivato, indica che il runtime non ha incluso il metodo chiamato nell'area a esecuzione vincolata definita. Il grafico chiamate è stato terminato in questo nodo perché se si continua a preparare il sottoalbero, si rischia di contribuire a nascondere il possibile errore.

Risoluzione

Aggiungere un contratto di affidabilità valido alla funzione o evitare di usare questa chiamata di funzione.

Effetto sull'ambiente di esecuzione

L'effetto della chiamata di un contratto debole da un'area a esecuzione vincolata può essere l'incapacità dell'area a esecuzione vincolata di completare le proprie operazioni. Questo problema può provocare il danneggiamento dello stato del processo e di AppDomain.

Output

Di seguito è riportato un esempio di output generato dall'assistente al debug gestito.

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.

Impostazione

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

Vedi anche