Partager via


invalidCERCall MDA

Note

Cet article est spécifique à .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.

L’Assistant invalidCERCall débogage managé (MDA) est activé lorsqu’il existe un appel dans le graphique de la région d’exécution contrainte (CER) vers une méthode qui n’a pas de contrat de fiabilité ou un contrat excessivement faible. Un contrat faible est un contrat qui déclare que le pire cas d’altération de l’état est de plus grande portée que l’instance passée à l’appel, autrement dit, l’état ou le AppDomain processus peut devenir endommagé ou que son résultat n’est pas toujours déterministement computable lorsqu’il est appelé dans un cer.

Symptômes

Résultats inattendus lors de l’exécution du code dans un cer. Les symptômes ne sont pas spécifiques. Il peut s’agir d’une exception inattendue OutOfMemoryException, d’un ThreadAbortExceptionou d’autres exceptions lors de l’appel dans la méthode non fiable, car le runtime ne l’a pas préparé à l’avance ou ne l’a pas protégé contre les ThreadAbortException exceptions au moment de l’exécution. Une plus grande menace est que toute exception résultant de la méthode au moment de l’exécution pourrait laisser le ou le AppDomain processus dans un état instable, qui est contraire à l’objectif d’un CER. La raison pour laquelle une cer est créée consiste à éviter les altérations d’état telles que celles-ci. Les symptômes de l’état endommagé sont propres à l’application, car la définition d’un état cohérent est différente entre les applications.

La cause

Le code au sein d’une cer appelle une fonction sans ReliabilityContractAttribute aucune ou avec une faiblesse ReliabilityContractAttribute qui n’est pas compatible avec l’exécution dans un cer.

En termes de syntaxe de contrat de fiabilité, un contrat faible est un contrat qui ne spécifie pas de Consistency valeur d’énumération ou spécifie une Consistency valeur de MayCorruptProcess, MayCorruptAppDomainou None. L’une de ces conditions indique que le code appelé peut entraver les efforts de l’autre code dans le CER pour maintenir l’état cohérent. Les CER permettent au code de traiter les erreurs de manière très déterministe, en conservant des invariants internes importants pour l’application et en lui permettant de continuer à s’exécuter face à des erreurs temporaires telles que des exceptions hors mémoire.

L’activation de cette MDA indique que la méthode appelée dans le cer peut échouer d’une manière que l’appelant ne s’attendait pas ou qui laisse l’état ou l’état AppDomain du processus endommagé ou irrécupérable. Bien sûr, le code appelé peut s’exécuter correctement et le problème est simplement un contrat manquant. Toutefois, les problèmes liés à l’écriture de code fiable sont subtils et l’absence d’un contrat est un bon indicateur que le code peut ne pas s’exécuter correctement. Les contrats sont des indicateurs que le programmeur a codé de manière fiable et promet également que ces garanties ne changeront pas dans les révisions futures du code. Autrement dit, les contrats sont des déclarations d’intention et pas seulement des détails de mise en œuvre.

Étant donné que toute méthode avec un contrat faible ou inexistant peut échouer de nombreuses façons imprévisibles, le runtime ne tente pas de supprimer l’un de ses propres échecs imprévisibles de la méthode introduite par la compilation JIT différée, la population de dictionnaires génériques ou les abandons de threads, par exemple. Autrement dit, lorsque ce MDA est activé, il indique que le runtime n’incluait pas la méthode appelée dans la cer en cours de définition ; le graphique d’appel a été arrêté à ce nœud, car la poursuite de la préparation de cette sous-arborescence permet de masquer l’erreur potentielle.

Résolution

Ajoutez un contrat de fiabilité valide à la fonction ou évitez d’utiliser cet appel de fonction.

Effet sur le runtime

L’effet de l’appel d’un contrat faible d’un CER peut être l’échec de l’exécution de ses opérations. Cela pourrait entraîner une corruption de l’état du AppDomain processus.

Output

Voici un exemple de sortie de cette 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.

Paramétrage

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

Voir aussi