invalidCERCall MDA
Kommentar
Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.
Den invalidCERCall
hanterade felsökningsassistenten (MDA) aktiveras när det finns ett anrop i grafen för begränsad körningsregion (CER) till en metod som inte har något tillförlitlighetskontrakt eller ett överdrivet svagt kontrakt. Ett svagt kontrakt är ett kontrakt som deklarerar att det värsta falltillståndet är större än den instans som skickas till anropet, det vill säga att processtillståndet eller processtillståndet AppDomain kan skadas eller att resultatet inte alltid är deterministiskt beräkningsbart när det anropas inom en CER.
Symtom
Oväntade resultat vid körning av kod i en CER. Symptomen är inte specifika. De kan vara ett oväntat OutOfMemoryException, ett ThreadAbortException, eller andra undantag vid anropet till den otillförlitliga metoden eftersom körningen inte förberedde den i förväg eller skyddade den från ThreadAbortException undantag vid körning. Ett större hot är att alla undantag som uppstår från metoden vid körning kan lämna AppDomain processen eller i ett instabilt tillstånd, vilket strider mot målet för en CER. Anledningen till att en CER skapas är att undvika tillståndsfel som detta. Symptomen på skadat tillstånd är programspecifika eftersom definitionen av konsekvent tillstånd skiljer sig mellan program.
Orsak
Kod i en CER anropar en funktion utan ReliabilityContractAttribute eller med en svag ReliabilityContractAttribute som inte är kompatibel med att köras i en CER.
När det gäller syntax för tillförlitlighetskontrakt är ett svagt kontrakt ett kontrakt som inte anger ett Consistency uppräkningsvärde eller anger värdet ConsistencyMayCorruptProcess, MayCorruptAppDomaineller None. Något av dessa villkor anger att den kod som anropas kan hindra den andra kodens arbete i CER för att upprätthålla konsekvent tillstånd. Cers tillåter kod att behandla fel på ett mycket deterministiskt sätt, upprätthålla interna invarianter som är viktiga för programmet och tillåta att det fortsätter att köras inför tillfälliga fel som out-of-memory-undantag.
Aktiveringen av denna MDA anger en möjlighet att metoden som anropas i CER kan misslyckas på ett sätt som anroparen inte förväntade sig eller som lämnar processtillståndet AppDomain skadat eller oåterkalleligt. Naturligtvis kan den anropade koden köras korrekt och problemet är helt enkelt ett saknat kontrakt. Problemen med att skriva tillförlitlig kod är dock subtila och avsaknaden av ett kontrakt är en bra indikator på att koden kanske inte körs korrekt. Kontrakten är indikatorer på att programmeraren har kodat på ett tillförlitligt sätt och lovar också att dessa garantier inte kommer att ändras i framtida revideringar av koden. Det vill: kontrakten är avsiktsförklaringar och inte bara implementeringsinformation.
Eftersom alla metoder med ett svagt eller obefintligt kontrakt potentiellt kan misslyckas på många oförutsägbara sätt, försöker körningen inte ta bort några av sina egna oförutsägbara fel från metoden som introduceras av lat JIT-kompilering, generiska ordlistepopulationer eller trådavbrott, till exempel. Det innebär att när den här MDA:en aktiveras anger det att körningen inte inkluderade den anropade metoden i cer som definieras. Anropsdiagrammet avslutades på den här noden eftersom det kan hjälpa till att maskera det potentiella felet om du fortsätter att förbereda det här underträdet.
Åtgärd
Lägg till ett giltigt tillförlitlighetskontrakt i funktionen eller undvik att använda funktionsanropet.
Effekt på körningen
Effekten av att anropa ett svagt kontrakt från en CER kan vara cer-misslyckandet med att slutföra sin verksamhet. Detta kan leda till att processtillståndet skadas AppDomain .
Output
Följande är exempelutdata från denna 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>