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

Megjegyzés:

Ez a cikk a .NET-keretrendszerre 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ákat, amelyek a kezelt és a nem kezelt 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-keretrendszerrel szállított MDA-kat sorolja fel:

MDA
aszinkronSzálMegszakítás
bindingFailure
callbackOnCollectedDelegate
contextSwitchDeadlock
dangerousThreadingAPI
Érvénytelen dátum/idő helyi formátum
dirtyCastAndCallOnInterface
disconnectedContext
dllMainReturnsFalse
kivételElnyelveHíváskorCOM-ból
sikertelenQI
fatalExecutionEngineError
gcManagedToUnmanaged
gcKezeletlenbőlKezeltre
illegalPrepareConstrainedRegion
érvénytelenLakásÁllapotVáltozás
invalidCERCall
invalidFunctionPointerInDelegate
érvénytelen GCHandleCookie
invalidIUnknown
érvénytelenTagNyilatkozat
invalidOverlappedToPinvoke
érvénytelenVerzió
jitCompilationStart
loaderLock
loadFromContext
marshalCleanupError
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
nemSerializálható
openGenericCERCall
átfedésben lévőFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
újrahívhatóság
releaseHandleFailed
reportAvOnComRelease
streamWriterPufferezettAdatVeszteség
virtualCERCall

A .NET-keretrendszer alapértelmezés szerint aktiválja az MDA-k egy részhalmazát az összes menedzselt hibakereső számára. Az alapértelmezett készletet a Visual Studióban a Hibakeresés menü >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.

Jótanács

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 az egyes MDA-k jelölőnégyzetében jelölje be vagy törölje a jelet az Állj meg, ha eldobták opció esetében.

Regisztrációs kulcs

Az MDA-k engedélyezéséhez adja hozzá a HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA alkulcsot (írja be REG_SZ, 1. érték) a Windows beállításjegyzékbe. 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), az MDA-beállítások beolvasása az ApplicationName.suffix.mda.config fájlból történik. A Jegyzettömbhöz tartozó MDA-konfigurációs fájl neve például notepad.exe.mda.config.

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óért lásd Application-Specific konfigurációs beállításokat . A rendszerleíró adatbázis beállítását felülírhatja a COMPLUS_MDA környezeti változó. 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 a jelen szakaszban korábban ismertetett MDADisable.reg fájl futtatásával tilthatja le.

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 karakterlánc egy MDA-név vagy más speciális vezérlőkarakterláncok eseti érzéketlen, pontosvesszővel elválasztott listája. Menedzselt vagy nem menedzselt hibakereső alatt történő indításkor alapértelmezés szerint egy MDA-készlet engedélyezve van. Implicit módon történik az alapértelmezés szerint a hibakeresők alatt engedélyezett MDA-k pontosvesszővel tagolt listájának előrefűzése a környezeti változó vagy a beállításkulcs értékéhez. A speciális vezérlőkarakterláncok a következők:

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

  • 1 - Beolvassa az MDA-beállításokat a(z) ApplicationName.mda.config.

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

  • 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.

  • A COMPLUS_MDA=gcUnmanagedToManaged lehetővé teszi a gcUnmanagedToManaged, valamint minden MDA-t, amely automatikusan engedélyezett egy hibakereső alatt.

  • 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.

Application-Specific 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; 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ípussá alakítanak át az alkalmazás minden felügyelt-nem felügyelt átmenet során. 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 engedélyezni szeretné az virtualCERCall és az invalidCERCall MDA-kat, akkor hozzá kell adnia a <invalidCERCall /> bejegyzést a <virtualCERCall /> bejegyzés elé. Ha a bejegyzések nem betűrendben vannak, egy kezeletlen érvénytelen konfigurációs fájlkivételi üzenet jelenik meg.

MDA-kivételek

MDA engedélyezése esetén az akkor is aktív, amikor a kódod nem fut hibakereső alatt. 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ésmenüBen a Windows>kivételbeállításait. A Kivételbeállítások ablakban bontsa ki a Felügyelt hibakeresési segédek listát, majd törölje a jelet az Kidobáskor megáll jelölőnégyzetből az egyes MDA-k esetében. Ezzel a párbeszédpanellel is engedélyezheti az MDA-kivétel párbeszédpanelek megjelenítését.

MDA-kimenet

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

Egy PInvoke függvényhívás, 'MDATest!MDATest.Program::StdCall', felborította a verem kiegyensúlyozottságát. Ennek oka valószínűleg az, hogy a felügyelt PInvoke-aláírás nem felel meg a nem felügyelt környezetbeli célaláírásnak. 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