Megosztás a következőn keresztül:


Felügyelt hibakeresési asszisztensekkel kapcsolatos hibák diagnosztizálása

Feljegyzés

Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A felügyelt hibakeresési asszisztensek (MDA-k) olyan hibakeresési segédek, amelyek a közös nyelvi futtatókörnyezettel (CLR) együttműködve nyújtanak információt a futtatókörnyezet állapotáról. Az asszisztensek tájékoztató üzeneteket hoznak létre a futásidejű eseményekről, amelyeket egyébként nem lehet csapdába csalni. Az MDA-k segítségével elkülönítheti a nehezen megtalálható alkalmazáshibáktól, amelyek a felügyelt és a nem felügyelt kód közötti váltáskor fordulnak elő.

Az összes MDA engedélyezéséhez vagy letiltásához adjon hozzá egy kulcsot a Windows beállításjegyzékéhez, vagy állítson be egy környezeti változót. Az alkalmazáskonfigurációs beállítások használatával engedélyezheti az adott MDA-kat. Az alkalmazás konfigurációs fájljában további konfigurációs beállításokat állíthat be egyes MDA-khoz. Mivel ezeket a konfigurációs fájlokat a futtatókörnyezet betöltésekor elemzi a rendszer, a felügyelt alkalmazás elindítása előtt engedélyeznie kell az MDA-t. A már elindított alkalmazások esetében nem engedélyezheti.

Az alábbi táblázat a .NET-keretrendszer szállító MDA-kat sorolja fel:

MDA
aszinkronThreadAbort
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
átfedésben lévőFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
újrarekedtség
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Alapértelmezés szerint a .NET-keretrendszer aktiválja az MDA-k egy részét az összes felügyelt hibakeresőhöz. Az alapértelmezett készletet a Visual Studióban a Hibakeresés menü Windows>kivételbeállítások elemével, majd a Felügyelt hibakeresési segédek listájának kibontásával tekintheti meg.

Kivételbeállítások ablak a Visual Studióban

MDA-k engedélyezése és letiltása

Az MDA-kat beállításkulcs, környezeti változó és alkalmazáskonfigurációs beállítások használatával engedélyezheti és tilthatja le. Az alkalmazáskonfigurációs beállítások használatához engedélyeznie kell a beállításkulcsot vagy a környezeti változót.

Tipp.

Az MDA-k letiltása helyett megakadályozhatja, hogy a Visual Studio megjelenítse az MDA párbeszédpanelt, amikor MDA-értesítés érkezik. Ehhez válassza a Windows>kivételbeállítások lehetőséget a Hibakeresés menüben, bontsa ki a Felügyelt hibakeresési asszisztensek listát, majd jelölje be vagy törölje a jelet az egyes MDA-knál a Kimaradáskor jelölőnégyzetből.

Beállításkulcs

Az MDA-k engedélyezéséhez adja hozzá a HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. NETFramework\MDA alkulcs (típus: REG_SZ, 1. érték) a Windows beállításjegyzékben. Másolja a következő példát egy MDAEnable.reg nevű szövegfájlba. Nyissa meg a Windows beállításszerkesztőt (RegEdit.exe), és a Fájl menüben válassza az Importálás lehetőséget. Válassza ki a MDAEnable.reg fájlt az MDA-k engedélyezéséhez a számítógépen. Ha az alkulcsot 1 sztringértékre állítja (nem 1 DWORD-értékre), akkor az MDA-beállítások beolvasása az ApplicationName.suffix.mda.config fájlból lehetővé válik. A Jegyzettömb MDA-konfigurációs fájljának neve például notepad.exe.mda.config lesz.

Windows Registry Editor Version 5.00

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

Ha a számítógép 32 bites alkalmazást futtat egy 64 bites operációs rendszeren, akkor az MDA-kulcsot az alábbihoz hasonlóan kell beállítani:

Windows Registry Editor Version 5.00

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

További információkért tekintse meg az alkalmazásspecifikus konfigurációs beállításokat . A beállításjegyzék-beállítást felül lehet bírálni a COMPLUS_MDA környezeti változóval. További információt a környezeti változóban talál.

Az MDA-k letiltásához állítsa az MDA alkulcsát 0 (nulla) értékre a Windows Beállításszerkesztővel.

Alapértelmezés szerint egyes MDA-k akkor is engedélyezve vannak, ha egy hibakeresőhöz csatolt alkalmazást futtat, még a beállításkulcs hozzáadása nélkül is. Ezeket az asszisztenseket letilthatja a jelen szakaszban ismertetett MDADisable.reg fájl futtatásával.

Környezeti változó

Az MDA aktiválását a beállításkulcsot felülíró környezeti változó COMPLUS_MDAis vezérelheti. A COMPLUS_MDA sztring az MDA-nevek vagy más speciális vezérlősztringek kis- és nagybetűkkel tagolt, pontosvesszővel tagolt listája. A felügyelt vagy nem felügyelt hibakeresőktől kezdve alapértelmezés szerint MDA-k halmaza engedélyezve van. Ez úgy történik, hogy implicit módon előre fel van függesztve a hibakeresők alatt alapértelmezés szerint engedélyezett MDA-k pontosvesszővel tagolt listájának a környezeti változó vagy a beállításkulcs értékére. A speciális vezérlősztringek a következők:

  • 0 - Inaktiválja az összes MDA-t.

  • 1– Beolvassa az MDA beállításait az ApplicationName.mda.config fájlból.

  • managedDebugger - Explicit módon aktiválja az összes olyan MDA-t, amely implicit módon aktiválódik, amikor egy felügyelt végrehajtható fájlt elindít egy hibakereső alatt.

  • unmanagedDebugger - Explicit módon aktiválja az összes olyan MDA-t, amely implicit módon aktiválódik, amikor egy nem felügyelt végrehajtható fájlt elindít egy hibakereső alatt.

Ütköző beállítások esetén a legutóbbi beállítások felülbírálják a korábbi beállításokat:

  • COMPLUS_MDA=0 letiltja az összes MDA-t, beleértve azokat is, amelyek implicit módon engedélyezve vannak egy hibakereső alatt.

  • COMPLUS_MDA=gcUnmanagedToManaged lehetővé teszi gcUnmanagedToManaged a hibakereső alatt implicit módon engedélyezett MDA-k mellett.

  • COMPLUS_MDA=0;gcUnmanagedToManaged engedélyezi gcUnmanagedToManaged , de letiltja azokat az MDA-kat, amelyek egyébként implicit módon engedélyezve lennének egy hibakereső alatt.

Alkalmazásspecifikus konfigurációs beállítások

Egyes asszisztenseket egyenként engedélyezheti, letilthat és konfigurálhat az alkalmazás MDA konfigurációs fájljában. Ha engedélyezni szeretné egy alkalmazáskonfigurációs fájl használatát az MDA-k konfigurálásához, be kell állítani az MDA beállításkulcsát vagy a COMPLUS_MDA környezeti változót. Az alkalmazáskonfigurációs fájl általában ugyanabban a könyvtárban található, mint az alkalmazás végrehajtható (.exe) fájlja. A fájlnév az ApplicationName.mda.config űrlapot használja, például notepad.exe.mda.config. Az alkalmazáskonfigurációs fájlban engedélyezett asszisztensek attribútumokkal vagy elemekkel rendelkezhetnek az asszisztens viselkedésének szabályozására.

Az alábbi példa bemutatja, hogyan engedélyezheti és konfigurálhatja a marsallást:

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

Az Marshaling MDA információkat bocsát ki arról a felügyelt típusról, amelyet nem felügyelt típusra rendeznek az alkalmazás minden felügyelt és nem felügyelt átmenetéhez. Az Marshaling MDA szűrheti a Metódusszűrő és a FieldFilter gyermekelemekben megadott metódus- és struktúramezők nevét is.

Az alábbi példa bemutatja, hogyan engedélyezheti több MDA-t az alapértelmezett beállítások használatával:

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

Fontos

Ha egy konfigurációs fájlban egynél több asszisztenst ad meg, betűrendben kell felsorolnia őket. Ha például az MDA-kat és az virtualCERCallinvalidCERCall MDA-kat is engedélyezni szeretné, a bejegyzés előtt hozzá kell adnia a <invalidCERCall /> bejegyzést <virtualCERCall /> . Ha a bejegyzések nem betűrendben vannak, egy kezeletlen érvénytelen konfigurációs fájlkivételi üzenet jelenik meg.

MDA-kivételek

Ha egy MDA engedélyezve van, akkor is aktív, ha a kód nem hibakereső alatt fut. Ha egy MDA-esemény akkor jön létre, amikor egy hibakereső nincs jelen, az eseményüzenet egy kezeletlen kivétel párbeszédpanelen jelenik meg, bár ez nem kezeletlen kivétel. A párbeszédpanel elkerülése érdekében távolítsa el az MDA-engedélyezés beállításait, ha a kód nem hibakeresési környezetben fut.

Amikor a kód a Visual Studio integrált fejlesztői környezetben (IDE) fut, elkerülheti az adott MDA-eseményeknél megjelenő kivétel párbeszédpanelt. Ehhez válassza a Hibakeresés menüBen a Windows>kivételbeállításait. A Kivétel beállításai ablakban bontsa ki a Felügyelt hibakeresési segédek listát, majd törölje a jelet az egyes MDA-knál a Kidobott állapotok jelölőnégyzetből. Ezzel a párbeszédpanellel is engedélyezheti az MDA-kivétel párbeszédpanelek megjelenítését.

MDA-kimenet

Az MDA kimenete hasonló az alábbi példához, amely az MDA kimenetét PInvokeStackImbalance mutatja:

Az MDATest! PInvoke függvény hívása MDATest.Program::StdCall' kiegyensúlyozza a vermet. Ennek oka valószínűleg az, hogy a felügyelt PInvoke-aláírás nem egyezik a nem felügyelt céladék aláírásával. Ellenőrizze, hogy a PInvoke-aláírás hívási konvenciói és paraméterei megegyeznek-e a cél nem felügyelt aláírással.

Lásd még