Delen via


invalidCERCall MDA

Notitie

Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.

De invalidCERCall beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer er een aanroep in de cer-grafiek (constrained execution region) wordt uitgevoerd voor een methode die geen betrouwbaarheidscontract of een overmatig zwak contract heeft. Een zwak contract is een contract dat aangeeft dat de slechtste toestand beschadigd is dan het exemplaar dat is doorgegeven aan de aanroep, dat wil zeggen dat de AppDomain status of processtatus beschadigd kan raken of dat het resultaat ervan niet altijd deterministisch kan worden aangeduid wanneer het binnen een CER wordt aangeroepen.

Symptomen

Onverwachte resultaten bij het uitvoeren van code in een CER. De symptomen zijn niet specifiek. Het kan een onverwachte OutOfMemoryException, een ThreadAbortExceptionof andere uitzonderingen zijn bij het aanroepen van de onbetrouwbare methode, omdat de runtime deze niet vooraf heeft voorbereid of deze tegen uitzonderingen tijdens runtime heeft beschermd ThreadAbortException . Een grotere bedreiging is dat elke uitzondering die het gevolg is van de methode tijdens runtime, het AppDomain of proces in een instabiele toestand kan verlaten, wat in strijd is met het doel van een CER. De reden waarom een CER wordt gemaakt, is om beschadigingen van statussen te voorkomen, zoals deze. De symptomen van beschadigde status zijn toepassingsspecifiek omdat de definitie van consistente status verschilt tussen toepassingen.

Oorzaak

Code binnen een CER roept een functie aan zonder ReliabilityContractAttribute of met een zwakke ReliabilityContractAttribute functie die niet compatibel is met het uitvoeren in een CER.

Wat de syntaxis van het betrouwbaarheidscontract betreft, is een zwak contract dat geen opsommingswaarde opgeeft Consistency of een Consistency waarde van MayCorruptProcess, MayCorruptAppDomainof None. Elk van deze voorwaarden geeft aan dat de aangeroepen code de inspanningen van de andere code in de CER kan belemmeren om consistente status te behouden. MET CER's kan code fouten op een zeer deterministische manier behandelen, interne invarianten onderhouden die belangrijk zijn voor de toepassing en toestaan om door te gaan met tijdelijke fouten, zoals uitzonderingen buiten het geheugen.

De activering van deze MDA geeft aan dat de methode die in de CER wordt aangeroepen, kan mislukken op een manier die de aanroeper niet heeft verwacht of die de AppDomain status of processtatus beschadigd of onherstelbaar heeft verlaten. De aangeroepen code kan natuurlijk correct worden uitgevoerd en het probleem is gewoon een ontbrekend contract. De problemen bij het schrijven van betrouwbare code zijn echter subtiel en het ontbreken van een contract is een goede indicator dat de code mogelijk niet correct wordt uitgevoerd. De contracten zijn indicatoren die de programmeur betrouwbaar heeft gecodeerd en belooft ook dat deze garanties niet zullen veranderen in toekomstige revisies van de code. Dat wil gezegd, de contracten zijn intentieverklaringen en niet alleen implementatiedetails.

Omdat elke methode met een zwak of niet-bestaand contract op vele onvoorspelbare manieren kan mislukken, probeert de runtime geen van de eigen onvoorspelbare fouten te verwijderen uit de methode die wordt geïntroduceerd door luie JIT-compiling, generieken woordenlijstpopulatie of threads, bijvoorbeeld. Wanneer deze MDA is geactiveerd, geeft dit aan dat de runtime de aangeroepen methode niet heeft opgenomen in de CER die wordt gedefinieerd; de aanroepgrafiek is beëindigd op dit knooppunt omdat het verder voorbereiden van deze substructuur de potentiële fout zou helpen maskeren.

Oplossing

Voeg een geldig betrouwbaarheidscontract toe aan de functie of vermijd het gebruik van die functie-aanroep.

Effect op de runtime

Het effect van het aanroepen van een zwak contract van een CER kan de CER-fout zijn om de bewerkingen te voltooien. Dit kan leiden tot beschadiging van de AppDomain processtatus.

Uitvoer

Hier volgt een voorbeeld van uitvoer van deze 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.

Configuratie

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

Zie ook