Dela via


Diagnostisera fel med hanterade felsökningsassistenter

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.

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 svälla. 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 parsas när körningen 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
asynchronousThreadAbort
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
marskalkning
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
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 Windows-undantagsinställningar>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.

Dricks

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. Om du vill göra det väljer du Inställningar för Windows-undantag> felsökningsmenyn, expanderar listan Hanterade felsökningsassistenter och markerar eller avmarkerar sedan kryssrutan Bryt när den genereras för den enskilda MDA:en.

Registernyckel

Om du vill aktivera MDA lägger du till HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. NETFramework\MDA-undernyckel (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 filen ApplicationName.suffix.mda.config. 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 i Programspecifika 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 de här assistenterna genom att köra filen MDADisable.reg 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. Om du börjar med ett hanterat eller ohanterat felsökningsprogram kan du som standard aktivera en uppsättning MDA:er. 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.

Programspecifika 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 marskalkningen:

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

Marshaling MDA genererar information om den hanterade typen som är samlad till en ohanterad typ för varje hanterad till ohanterad övergång 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 ogiltigt undantagsmeddelande för konfigurationsfilen.

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äljer Windows-undantagsinställningar>. I fönstret Undantagsinställningar expanderar du listan Hanterade felsökningsassistenter och avmarkerar sedan kryssrutan Bryt när den genereras 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