Freigeben über


invalidCERCall MDA

Hinweis

Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der invalidCERCall verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird aktiviert, wenn ein Aufruf innerhalb des CER-Diagramms (eingeschränkter Ausführungsbereich) für eine Methode ohne Zuverlässigkeitsvertrag oder einen übermäßig schwachen Vertrag vorhanden ist. Ein schwacher Vertrag ist ein Vertrag, der angibt, dass die Beschädigung des schlimmsten Fallzustands einen größeren Umfang hat als die Instanz, die an den Aufruf übergeben wurde, d. h. der AppDomain Prozessstatus kann beschädigt werden oder dass sein Ergebnis nicht immer deterministisch kompputierbar ist, wenn innerhalb einer CER aufgerufen wird.

Symptome

Unerwartete Ergebnisse beim Ausführen von Code in einer CER. Die Symptome sind nicht spezifisch. Sie könnten ein unerwartetes OutOfMemoryException, a ThreadAbortExceptionoder andere Ausnahmen beim Aufruf der unzuverlässigen Methode sein, da die Laufzeit sie nicht vorab vorbereitet oder vor ThreadAbortException Ausnahmen zur Laufzeit schützte. Eine größere Bedrohung besteht darin, dass jede Ausnahme, die sich aus der Methode zur Laufzeit ergibt, den AppDomain Vorgang in einem instabilen Zustand belassen könnte, der dem Ziel einer CER widerspricht. Der Grund, warum eine CER erstellt wird, besteht darin, Zustandsbeschädigungen wie dies zu vermeiden. Die Symptome eines beschädigten Zustands sind anwendungsspezifisch, da die Definition eines konsistenten Zustands zwischen Anwendungen unterschiedlich ist.

Ursache

Code innerhalb einer CER ruft eine Funktion ohne ReliabilityContractAttribute oder mit einer schwachen ReliabilityContractAttribute Funktion auf, die nicht mit der Ausführung in einer CER kompatibel ist.

In Bezug auf die Zuverlässigkeitskontraktsyntax ist ein schwacher Vertrag ein Vertrag, der keinen Enumerationswert angibt oder einen Consistency Wert von MayCorruptProcess, oder MayCorruptAppDomainNone.Consistency Jede dieser Bedingungen weist darauf hin, dass der aufgerufene Code die Bemühungen des anderen Codes in der CER behindern kann, um einen konsistenten Zustand aufrechtzuerhalten. CERs ermöglichen es Code, Fehler auf eine sehr deterministische Weise zu behandeln und interne Invarianten beizubehalten, die für die Anwendung wichtig sind, und es zu ermöglichen, angesichts vorübergehender Fehler wie Out-of-Memory-Ausnahmen weiter ausgeführt zu werden.

Die Aktivierung dieses MDA weist darauf hin, dass die in der CER aufgerufene Methode fehlschlägt, sodass der Aufrufer nicht erwartet oder den Zustand des AppDomain Prozesses beschädigt oder nicht wiederhergestellt werden kann. Natürlich kann der aufgerufene Code richtig ausgeführt werden, und das Problem ist einfach ein fehlender Vertrag. Die Probleme beim Schreiben von zuverlässigem Code sind jedoch subtil, und das Fehlen eines Vertrags ist ein guter Indikator, den der Code möglicherweise nicht ordnungsgemäß ausführt. Die Verträge sind Indikatoren, die der Programmierer zuverlässig codiert hat, und verspricht auch, dass diese Garantien in zukünftigen Überarbeitungen des Codes nicht geändert werden. Das heißt, die Verträge sind Absichtserklärungen und nicht nur Implementierungsdetails.

Da jede Methode mit einem schwachen oder nicht vorhandenen Vertrag möglicherweise auf viele unvorhersehbare Weise fehlschlagen kann, versucht die Laufzeit nicht, eigene unvorhersehbare Fehler aus der Methode zu entfernen, die durch faule JIT-Kompilierung, Generische Wörterbuchgesamtheit oder Threadabbrüche eingeführt werden. Wenn diese MDA aktiviert wird, bedeutet dies, dass die Laufzeit die aufgerufene Methode nicht in die zu definierende CER aufgenommen hat; Das Aufrufdiagramm wurde an diesem Knoten beendet, da die Vorbereitung dieser Unterstruktur dazu beitragen würde, den potenziellen Fehler zu maskieren.

Beschluss

Fügen Sie der Funktion einen gültigen Zuverlässigkeitsvertrag hinzu, oder vermeiden Sie die Verwendung dieses Funktionsaufrufs.

Effekt auf die Laufzeit

Die Auswirkung des Aufrufs eines schwachen Vertrags von einer CER könnte die CER sein, die ihre Vorgänge nicht abschließen konnte. Dies könnte zu Einer Beschädigung des AppDomain Prozesszustands führen.

Output

Im Folgenden sehen Sie eine Beispielausgabe dieser 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.

Konfiguration

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

Siehe auch