Dela via


Diagnostisera fel med hanterade felsökningsassistenter

Anmärkning

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.

Hanterade felsökningsassistenter (MDA) felsöker hjälpmedel som fungerar med CLR (Common Language Runtime) för att ge information om körningstillstånd. Assistenterna genererar informationsmeddelanden om körningshändelser som du annars inte kan fånga upp. Du kan använda MDA:er för att isolera programbuggar som uppstår när du övergår mellan hanterad och ohanterad kod.

Du kan aktivera eller inaktivera alla MDA:er genom att lägga till en nyckel i Windows-registret eller genom att ange en miljövariabel. Du kan aktivera specifika MDA:er med hjälp av inställningar för programkonfiguration. Du kan ange ytterligare konfigurationsinställningar för vissa enskilda MDA:er i programmets konfigurationsfil. Eftersom dessa konfigurationsfiler tolkas när runtime-miljön läses in måste du aktivera MDA innan det hanterade programmet startar. Du kan inte aktivera den för program som redan har startats.

I följande tabell visas de MDA:er som levereras med .NET Framework:

MDA
asynkrontrådAvbrott
bindningsfel
callbackOnCollectedDelegate
kontextväxlingslåsning
dangerousThreadingAPI
dateTimeInvalidLocalFormat
dirtyCastAndCallOnInterface
frånkoppladKontext
dllMainReturnsFalse
undantagUndertrycktVidAnropFrånCom
misslyckadQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcUnmanagedToManaged
illegalPrepareConstrainedRegion
Ogiltig byte av lägenhetstillstånd (invalidApartmentStateChange)
ogiltigCERCall
invalidFunctionPointerInDelegate
invalidGCHandleCookie
invalidIUnknown
invalidMemberDeclaration
invalidOverlappedToPinvoke
ogiltigVariant
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
samordning
skapandeAvMedlemsInfoCache
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
återinträde
releaseHandleFailed
reportAvOnComRelease
streamWriterBuffradDataFörlorad
virtualCERCall

Som standard aktiverar .NET Framework en delmängd av MDA:er för alla hanterade felsökningsprogram. Du kan visa standarduppsättningen i Visual Studio genom att välja> på felsökningsmenyn och sedan expandera listan Hanterade felsökningsassistenter.

Fönstret Undantagsinställningar i Visual Studio

Aktivera och inaktivera MDA:er

Du kan aktivera och inaktivera MDA:er med hjälp av en registernyckel, en miljövariabel och programkonfigurationsinställningar. Du måste aktivera antingen registernyckeln eller miljövariabeln för att kunna använda programkonfigurationsinställningarna.

Tips/Råd

I stället för att inaktivera MDA:er kan du förhindra att Visual Studio visar MDA-dialogrutan när ett MDA-meddelande tas emot. För att göra det, välj Windows>Inställningar för undantag på menyn Felsökning, expandera listan Hanterade felsökningsassistenter och markera eller avmarkera sedan kryssrutan Bryt när den kastas för den enskilda MDA:en.

Registernyckel

Om du vill aktivera MDA lägger du till undernyckelnHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (typ REG_SZ, värde 1) i Windows-registret. Kopiera följande exempel till en textfil med namnet MDAEnable.reg. Öppna Windows-registereditorn (RegEdit.exe) och välj ImporteraArkiv-menyn. Välj filen MDAEnable.reg för att aktivera MDA på datorn. Om du anger undernyckeln till strängvärdet 1 (inte DWORD-värdet 1) kan du läsa MDA-inställningarna från ApplicationName.suffixet.mda.config-filen. Till exempel heter MDA-konfigurationsfilen för Anteckningar notepad.exe.mda.config.

Windows Registry Editor Version 5.00

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

Om datorn kör ett 32-bitarsprogram på ett 64-bitars operativsystem bör MDA-nyckeln anges så här:

Windows Registry Editor Version 5.00

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

Mer information finns iApplication-Specific Konfigurationsinställningar . Registerinställningen kan åsidosättas av COMPLUS_MDA miljövariabeln. Mer information finns i Miljövariabel .

Om du vill inaktivera MDA:er anger du MDA-undernyckeln till 0 (noll) med hjälp av Windows-registereditorn.

Som standard aktiveras vissa MDA:er när du kör ett program som är kopplat till ett felsökningsprogram, även utan att lägga till registernyckeln. Du kan inaktivera dessa assistenter genom att köra MDADisable.reg-filen enligt beskrivningen tidigare i det här avsnittet.

Miljövariabel

MDA-aktivering kan också styras av miljövariabeln COMPLUS_MDA, som åsidosätter registernyckeln. Strängen COMPLUS_MDA är en skiftlägeskänslig, semikolonavgränsad lista över MDA-namn eller andra särskilda kontrollsträngar. Genom att starta under en hanterad eller ohanterad debugger aktiveras en uppsättning MDA:er som standard. Detta görs genom att implicit föregripa den semikolonavgränsade listan över MDA:er som är aktiverade som standard under felsökningsprogram till värdet för miljövariabeln eller registernyckeln. De särskilda kontrollsträngarna är följande:

  • 0 – Inaktiverar alla MDA:er.

  • 1 – Läser MDA-inställningar från ApplicationName.mda.config.

  • managedDebugger – Aktiverar uttryckligen alla MDA:er som implicit aktiveras när en hanterad körbar fil startas under ett felsökningsprogram.

  • unmanagedDebugger – Aktiverar uttryckligen alla MDA:er som implicit aktiveras när en ohanterad körbar fil startas under ett felsökningsprogram.

Om det finns motstridiga inställningar åsidosätter de senaste inställningarna tidigare inställningar:

  • COMPLUS_MDA=0 inaktiverar alla MDA:er, inklusive de som implicit aktiveras under ett felsökningsprogram.

  • COMPLUS_MDA=gcUnmanagedToManaged aktiverar gcUnmanagedToManaged utöver eventuella MDA:er som implicit aktiveras under ett felsökningsprogram.

  • COMPLUS_MDA=0;gcUnmanagedToManaged aktiverar gcUnmanagedToManaged men inaktiverar MDA:er som annars implicit skulle aktiveras under ett felsökningsprogram.

Application-Specific konfigurationsinställningar

Du kan aktivera, inaktivera och konfigurera vissa assistenter individuellt i MDA-konfigurationsfilen för programmet. Om du vill aktivera användning av en programkonfigurationsfil för att konfigurera MDA måste antingen MDA-registernyckeln eller COMPLUS_MDA miljövariabeln anges. Programkonfigurationsfilen finns vanligtvis i samma katalog som programmets körbara fil (.exe). Filnamnet har formatet ApplicationName.mda.config; till exempel notepad.exe.mda.config. Assistenter som är aktiverade i programkonfigurationsfilen kan ha attribut eller element som är utformade för att styra assistentens beteende.

I följande exempel visas hur du aktiverar och konfigurerar marshaling:

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

Marshaling MDA avger information om den hanterade typen som omvandlas till en ohanterad typ för varje övergång från hanterad till ohanterad i programmet. Marshaling MDA kan också filtrera namnen på de metod- och strukturfält som anges i de underordnade elementen methodFilter respektive fieldFilter.

I följande exempel visas hur du aktiverar flera MDA med hjälp av deras standardinställningar:

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

Viktigt!

När du anger fler än en assistent i en konfigurationsfil måste du ange dem i alfabetisk ordning. Om du till exempel vill aktivera både virtualCERCall och invalidCERCall MDA måste du lägga till <invalidCERCall /> posten före <virtualCERCall /> posten. Om posterna inte är i alfabetisk ordning visas ett meddelande om en ohanterad ogiltig konfigurationsfilundantag.

MDA-undantag

När en MDA är aktiverad är den aktiv även när koden inte körs under ett felsökningsprogram. Om en MDA-händelse utlöses när ett felsökningsprogram inte finns visas händelsemeddelandet i en ohanterad undantagsdialogruta, även om det inte är ett ohanterat undantag. Undvik dialogrutan genom att ta bort de MDA-aktiverande inställningarna när koden inte körs i en felsökningsmiljö.

När koden körs i Visual Studio Integrated Development Environment (IDE) kan du undvika den undantagsdialogruta som visas för specifika MDA-händelser. Om du vill göra det går du till felsökningsmenyn och väljerWindows-undantagsinställningar>. I fönstret Undantagsinställningar expanderar du listan Hanterade felsökningsassistenter, och sedan avmarkerar du kryssrutan Bryt vid utlösning för den enskilda MDA:en. Du kan också använda den här dialogrutan för att aktivera visning av dialogrutor för MDA-undantag.

MDA-utdata

MDA-utdata liknar följande exempel, som visar utdata från PInvokeStackImbalance MDA:

Ett anrop till PInvoke-funktionen 'MDATest! MDATest.Program::StdCall' har obalanserat stacken. Detta beror troligen på att den hanterade PInvoke-signaturen inte matchar den ohanterade målsignaturen. Kontrollera att anropskonventionen och parametrarna för PInvoke-signaturen matchar den ohanterade målsignaturen.

Se även