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:
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> påfelsökningsmenyn och sedan expandera listan Hanterade felsökningsassistenter.
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> på 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 Importera på Arkiv-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
aktiverargcUnmanagedToManaged
utöver eventuella MDA:er som implicit aktiveras under ett felsökningsprogram.COMPLUS_MDA=0;gcUnmanagedToManaged
aktiverargcUnmanagedToManaged
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.