Delen via


Fouten diagnosticeren met beheerde foutopsporingsassistenten

Notitie

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

Beheerde foutopsporingsassistenten (MBA's) zijn hulpprogramma's voor foutopsporing die werken met de Common Language Runtime (CLR) om informatie over runtimestatus te bieden. De assistenten genereren informatieve berichten over runtime-gebeurtenissen die u anders niet kunt onderschekken. U kunt MDA's gebruiken om moeilijk te vinden toepassingsfouten te isoleren die optreden bij de overgang tussen beheerde en onbeheerde code.

U kunt alle MDA's in- of uitschakelen door een sleutel toe te voegen aan het Windows-register of door een omgevingsvariabele in te stellen. U kunt specifieke MDA's inschakelen met behulp van toepassingsconfiguratie-instellingen. U kunt aanvullende configuratie-instellingen instellen voor sommige afzonderlijke MDA's in het configuratiebestand van de toepassing. Omdat deze configuratiebestanden worden geparseerd wanneer de runtime wordt geladen, moet u de MDA inschakelen voordat de beheerde toepassing wordt gestart. U kunt deze niet inschakelen voor toepassingen die al zijn gestart.

De volgende tabel bevat de MDA's die worden verzonden met .NET Framework:

MDA
asynchroonThreadAbort
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
exceptionSwallowedOnCallFromCom
failedQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
invalidApartmentStateChange
invalidCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
invalidVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Standaard activeert .NET Framework een subset van MDA's voor alle beheerde foutopsporingsprogramma's. U kunt de standaardset in Visual Studio weergeven door Windows-uitzonderingsinstellingen> te kiezen in het menu Foutopsporing en vervolgens de lijst met assistenten voor beheerde foutopsporing uit te vouwen.

Venster Uitzonderingsinstellingen in Visual Studio

MBA's in- en uitschakelen

U kunt MDA's in- en uitschakelen met behulp van een registersleutel, een omgevingsvariabele en configuratie-instellingen voor toepassingen. U moet de registersleutel of de omgevingsvariabele inschakelen om de configuratie-instellingen van de toepassing te kunnen gebruiken.

Tip

In plaats van MDA's uit te schakelen, kunt u voorkomen dat Visual Studio het MDA-dialoogvenster weergeeft wanneer er een MDA-melding wordt ontvangen. Hiervoor kiest u Windows-uitzonderingsinstellingen> in het menu Foutopsporing, vouwt u de lijst met assistenten voor beheerde foutopsporing uit en schakelt u vervolgens het selectievakje Onderbreken wanneer gegenereerd voor de afzonderlijke MDA in of uit.

Registersleutel

Als u MBA's wilt inschakelen, voegt u de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. NETFramework\MDA-subsleutel (type REG_SZ, waarde 1) in het Windows-register. Kopieer het volgende voorbeeld naar een tekstbestand met de naam MDAEnable.reg. Open de Windows-registereditor (RegEdit.exe) en kies Importeren in het menu Bestand. Selecteer het MDAEnable.reg-bestand om MBA's op die computer in te schakelen. Als u de subsleutel instelt op tekenreekswaarde 1 (niet DWORD-waarde van 1), kunt u MDA-instellingen lezen uit het bestand ApplicationName.suffix.mda.config. Het MDA-configuratiebestand voor Kladblok heeft bijvoorbeeld de naam notepad.exe.mda.config.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Als op de computer een 32-bits toepassing wordt uitgevoerd op een 64-bits besturingssysteem, moet de MDA-sleutel als volgt worden ingesteld:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework]
"MDA"="1"

Zie Toepassingsspecifieke configuratie-instellingen voor meer informatie. De registerinstelling kan worden overschreven door de COMPLUS_MDA omgevingsvariabele. Zie Omgevingsvariabele voor meer informatie.

Als u MDA-subsleutels wilt uitschakelen, stelt u de MDA-subsleutel in op 0 (nul) met behulp van de Register-editor van Windows.

Sommige MDA's zijn standaard ingeschakeld wanneer u een toepassing uitvoert die is gekoppeld aan een foutopsporingsprogramma, zelfs zonder de registersleutel toe te voegen. U kunt deze assistenten uitschakelen door het MDADisable.reg-bestand uit te voeren, zoals eerder in deze sectie is beschreven.

Omgevingsvariabele

MDA-activering kan ook worden beheerd door de omgevingsvariabele COMPLUS_MDA, waardoor de registersleutel wordt overschreven. De COMPLUS_MDA tekenreeks is een niet hoofdlettergevoelige, door puntkomma's gescheiden lijst met MDA-namen of andere speciale besturingsreeksen. Als u begint onder een beheerd of niet-beheerd foutopsporingsprogramma, wordt standaard een set MDA's ingeschakeld. Dit wordt gedaan door impliciet de door puntkomma's gescheiden lijst met MBA's die standaard zijn ingeschakeld onder foutopsporingsprogramma's toe te staan aan de waarde van de omgevingsvariabele of registersleutel. De speciale besturingsreeksen zijn het volgende:

  • 0 - Alle MBA's deactiveren.

  • 1 - Leest MDA-instellingen uit ApplicationName.mda.config.

  • managedDebugger - Activeert expliciet alle MDA's die impliciet worden geactiveerd wanneer een beheerd uitvoerbaar bestand wordt gestart onder een foutopsporingsprogramma.

  • unmanagedDebugger - Activeert expliciet alle MDA's die impliciet worden geactiveerd wanneer een niet-beheerd uitvoerbaar bestand wordt gestart onder een foutopsporingsprogramma.

Als er conflicterende instellingen zijn, overschrijven de meest recente instellingen vorige instellingen:

  • COMPLUS_MDA=0 schakelt alle MDA's uit, inclusief die impliciet ingeschakeld onder een foutopsporingsprogramma.

  • COMPLUS_MDA=gcUnmanagedToManagedgcUnmanagedToManaged maakt niet alleen eventuele MDA's mogelijk die impliciet zijn ingeschakeld onder een foutopsporingsprogramma.

  • COMPLUS_MDA=0;gcUnmanagedToManagedgcUnmanagedToManaged schakelt DBA's in maar uit die anders impliciet worden ingeschakeld onder een foutopsporingsprogramma.

Toepassingsspecifieke configuratie-instellingen

U kunt bepaalde assistenten afzonderlijk inschakelen, uitschakelen en configureren in het MDA-configuratiebestand voor de toepassing. Als u het gebruik van een toepassingsconfiguratiebestand voor het configureren van MDA's wilt inschakelen, moet de MDA-registersleutel of de COMPLUS_MDA omgevingsvariabele worden ingesteld. Het configuratiebestand van de toepassing bevindt zich meestal in dezelfde map als het uitvoerbare bestand van de toepassing (.exe). De bestandsnaam heeft de vorm ApplicationName.mda.config, bijvoorbeeld notepad.exe.mda.config. Assistenten die zijn ingeschakeld in het configuratiebestand van de toepassing, hebben mogelijk kenmerken of elementen die zijn ontworpen om het gedrag van die assistent te beheren.

In het volgende voorbeeld ziet u hoe u de marshaling inschakelt en configureert:

<mdaConfig>
  <assistants>
    <marshaling>
      <methodFilter>
        <match name="*"/>
      </methodFilter>
      <fieldFilter>
        <match name="*"/>
      </fieldFilter>
    </marshaling>
  </assistants>
</mdaConfig>

De Marshaling MDA verzendt informatie over het beheerde type dat wordt ge marshalld naar een niet-beheerd type voor elke beheerde naar onbeheerde overgang in de toepassing. De Marshaling MDA kan ook de namen filteren van de methode- en structuurvelden die zijn opgegeven in de onderliggende elementen methodFilter en fieldFilter.

In het volgende voorbeeld ziet u hoe u meerdere MBA's kunt inschakelen met behulp van hun standaardinstellingen:

<mdaConfig>
  <assistants>
    <illegalPrepareConstrainedRegion />
    <invalidCERCall />
    <openGenericCERCall />
    <virtualCERCall />
  </assistants>
</mdaConfig>

Belangrijk

Wanneer u meer dan één assistent opgeeft in een configuratiebestand, moet u deze in alfabetische volgorde weergeven. Als u bijvoorbeeld zowel de virtualCERCall als de invalidCERCall MDA's wilt inschakelen, moet u de <invalidCERCall /> vermelding vóór de <virtualCERCall /> vermelding toevoegen. Als de vermeldingen niet in alfabetische volgorde staan, wordt er een niet-verwerkte uitzonderingsbericht voor een ongeldig configuratiebestand weergegeven.

MDA-uitzonderingen

Wanneer een MDA is ingeschakeld, is deze actief, zelfs wanneer uw code niet wordt uitgevoerd onder een foutopsporingsprogramma. Als er een MDA-gebeurtenis optreedt wanneer er geen foutopsporingsprogramma aanwezig is, wordt het gebeurtenisbericht weergegeven in een niet-verwerkte uitzonderingsdialoogvenster, hoewel dit geen onverwerkte uitzondering is. Als u het dialoogvenster wilt voorkomen, verwijdert u de instellingen voor MDA-inschakelen wanneer uw code niet wordt uitgevoerd in een foutopsporingsomgeving.

Wanneer uw code wordt uitgevoerd in de Integrated Development Environment (IDE) van Visual Studio, kunt u het uitzonderingsdialoogvenster voorkomen dat wordt weergegeven voor specifieke MDA-gebeurtenissen. Hiervoor kiest u in het menu Foutopsporing windows-uitzonderingsinstellingen>. Vouw in het venster Uitzonderingsinstellingen de lijst met assistenten voor beheerde foutopsporing uit en schakel vervolgens het selectievakje Einde wanneer gegenereerd voor de afzonderlijke MDA uit. U kunt dit dialoogvenster ook gebruiken om de weergave van MDA-uitzonderingsdialoogvensters in te schakelen .

MDA-uitvoer

MDA-uitvoer is vergelijkbaar met het volgende voorbeeld, waarin de uitvoer van de PInvokeStackImbalance MDA wordt weergegeven:

Een aanroep van de PInvoke-functie 'MDATest! MDATest.Program::StdCall' heeft de stapel ongebalanceerd. Dit komt waarschijnlijk doordat de beheerde PInvoke-handtekening niet overeenkomt met de onbeheerde doelhandtekening. Controleer of de aanroepende conventie en parameters van de PInvoke-handtekening overeenkomen met de niet-beheerde doelhandtekening.

Zie ook