MDA invalidCERCallinvalidCERCall MDA

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.The invalidCERCall managed debugging assistant (MDA) is activated when there is a call within the constrained execution region (CER) graph to a method that has no reliability contract or an excessively weak contract. 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.A weak contract is a contract that declares that the worst case state corruption is of greater scope than the instance passed to the call, that is, the AppDomain or process state may become corrupted or that its result is not always deterministically computable when called within a CER.

SintomiSymptoms

Risultati imprevisti durante l'esecuzione di codice in un'area a esecuzione vincolata.Unexpected results when executing code in a CER. I sintomi non sono specifici.The symptoms are not specific. 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.They could be an unexpected OutOfMemoryException, a ThreadAbortException, or other exceptions at the call into the unreliable method because the runtime did not prepare it ahead of time or protect it from ThreadAbortException exceptions at run time. 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.A greater threat is that any exception resulting from the method at run time could leave the AppDomain or process in an unstable state, which is contrary to the objective of a CER. Il motivo della creazione di un'area a esecuzione vincolata è evitare danneggiamenti dello stato come questo.The reason a CER is created is to avoid state corruptions such as this. I sintomi di uno stato danneggiato sono specifici dell'applicazione, perché la definizione di stato coerente varia a seconda dell'applicazione.The symptoms of corrupt state are application specific because the definition of consistent state is different between applications.

CausaCause

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.Code within a CER is calling a function with no ReliabilityContractAttribute or with a weak ReliabilityContractAttribute that is not compatible with running in a CER.

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.In terms of reliability contract syntax, a weak contract is a contract that does not specify a Consistency enumeration value or specifies a Consistency value of MayCorruptProcess, MayCorruptAppDomain, or 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.Any of these conditions indicates that the code called may impede the efforts of the other code in the CER to maintain consistent state. 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.CERs allow code to treat errors in a very deterministic manner, maintaining internal invariants that are important to the application and allowing it to continue running in the face of transient errors such as out-of-memory exceptions.

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.The activation of this MDA indicates a possibility the method being called in the CER can fail in a way that the caller did not expect or that leaves the AppDomain or process state corrupted or unrecoverable. Naturalmente, è possibile che il codice chiamato venga eseguito correttamente e che il problema sia semplicemente un contratto mancante.Of course, the called code might execute correctly and the problem is simply a missing contract. 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.However, the issues involved in writing reliable code are subtle and the absence of a contract is a good indicator the code might not execute correctly. 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.The contracts are indicators that the programmer has coded reliably and also promises that these guarantees will not change in future revisions of the code. Questo significa che i contratti sono dichiarazioni di intenti e non solo dettagli di implementazione.That is, the contracts are declarations of intent and not just implementation details.

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.Because any method with a weak or nonexistent contract can potentially fail in many unpredictable ways, the runtime does not attempt to remove any of its own unpredictable failures from the method that are introduced by lazy JIT-compiling, generics dictionary population, or thread aborts, for example. 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.That is, when this MDA is activated, it indicates that the runtime did not include the called method in the CER being defined; the call graph was terminated at this node because continuing to prepare this subtree would help mask the potential error.

RisoluzioneResolution

Aggiungere un contratto di affidabilità valido alla funzione o evitare di usare questa chiamata di funzione.Add a valid reliability contract to the function or avoid using that function call.

Effetto sull'ambiente di esecuzioneEffect on the Runtime

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.The effect of calling a weak contract from a CER could be the CER failure to complete its operations. Questo problema può provocare il danneggiamento dello stato del processo e di AppDomain.This could lead to corruption of the AppDomain process state.

OutputOutput

Di seguito è riportato un esempio di output generato dall'assistente al debug gestito.The following is sample output from this 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.

ConfigurazioneConfiguration

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

Vedere ancheSee Also

PrepareMethod
System.Runtime.ConstrainedExecution
Diagnostica degli errori tramite gli assistenti al debug gestitoDiagnosing Errors with Managed Debugging Assistants