Condividi tramite


Diagnostica degli errori tramite gli assistenti al debug gestito

Aggiornamento: Luglio 2008

Gli assistenti al debug gestito sono strumenti di debug che, insieme a Common Language Runtime, forniscono informazioni sullo stato di esecuzione. Questi strumenti generano messaggi informativi sugli eventi di runtime che non possono essere altrimenti intercettati. Gli assistenti al debug gestito possono essere utilizzati per isolare i bug dell'applicazione di difficile individuazione che si verificano nella transizione tra codice gestito e codice non gestito. È possibile abilitare o disabilitare tutti gli assistenti al debug gestito aggiungendo una chiave al Registro di sistema di Windows o impostando una variabile di ambiente. Per abilitare un assistente al debug gestito specifico, utilizzare le impostazioni di configurazione dell'applicazione. Nel file di configurazione dell'applicazione è possibile definire impostazioni di configurazione aggiuntive per determinati assistenti al debug gestito. Poiché i file di configurazione vengono analizzati al momento del caricamento di Common Language Runtime, l'assistente al debug gestito deve essere abilitato prima dell'avvio dell'applicazione gestita. Non è possibile abilitare un assistente al debug gestito per applicazioni già avviate.

Nota:

Quando un MDA viene attivato, rimane attivo anche quando il codice non viene eseguito sotto il controllo di un debugger. Se viene generato un evento dell'MDA quando non è presente un debugger, il messaggio di evento viene visualizzato in una finestra di dialogo dell'eccezione non gestita, sebbene non si tratti di un'eccezione non gestita. Per evitare che venga visualizzata la finestra di dialogo, rimuovere le impostazioni che attivano l'MDA quando il codice non viene eseguito in un ambiente di debug.

Nota:

Quando il codice esegue l'IDE di Visual Studio, è possibile evitare la finestra di dialogo dell'eccezione visualizzata per specifici eventi di assistenti al debug gestito. A tale scopo, scegliere Eccezioni dal menu Debug. Se il menu Debug non contiene il comando Eccezioni, scegliere Personalizza dal menu Strumenti per aggiungerlo. Nella finestra di dialogo Eccezioni espandere l'elenco Assistenti al debug gestito, quindi deselezionare la casella di controllo Generata per il singolo assistente al debug gestito. Ad esempio, per evitare la finestra di dialogo dell'eccezione per un oggetto MDA contextSwitchDeadlock, deselezionare la casella di controllo Generata accanto al nome nell'elenco Assistenti al debug gestito. Questa finestra di dialogo può anche essere utilizzata attivare gli assistenti al debug gestito.

Nella tabella riportata di seguito solo elencati gli assistenti al debug gestito forniti con .NET Framework.

MDA asynchronousThreadAbort

MDA bindingFailure

MDA callbackOnCollectedDelegate

MDA contextSwitchDeadlock

MDA dangerousThreadingAPI

MDA dateTimeInvalidLocalFormat

MDA dirtyCastAndCallOnInterface

MDA disconnectedContext

MDA dllMainReturnsFalse

MDA exceptionSwallowedOnCallFromCom

MDA failedQI

MDA fatalExecutionEngineError

MDA gcManagedToUnmanaged

MDA gcUnmanagedToManaged

MDA illegalPrepareConstrainedRegion

MDA invalidApartmentStateChange

MDA invalidCERCall

MDA invalidFunctionPointerInDelegate

MDA invalidGCHandleCookie

MDA invalidIUnknown

MDA invalidMemberDeclaration

MDA invalidOverlappedToPinvoke

MDA invalidVariant

MDA jitCompilationStart

MDA loaderLock

MDA loadFromContext

MDA marshalCleanupError

MDA marshaling

MDA memberInfoCacheCreation

MDA moduloObjectHashcode

MDA nonComVisibleBaseClass

MDA notMarshalable

MDA openGenericCERCall

MDA overlappedFreeError

MDA pInvokeLog

MDA pInvokeStackImbalance

MDA raceOnRCWCleanup

Reentrancy

MDA releaseHandleFailed

MDA reportAvOnComRelease

MDA streamWriterBufferedDataLost

MDA virtualCERCall

Per impostazione predefinita, in .NET Framework viene attivato un sottoinsieme di MDA per tutti i debugger gestiti. È possibile visualizzare l'insieme predefinito in Visual Studio scegliendo Eccezioni dal menu Debug ed espandendo l'elenco Assistenti al debug gestito.

Abilitazione e disabilitazione degli assistenti al debug gestito

Per abilitare e disabilitare gli assistenti al debug gestito è possibile utilizzare una chiave del Registro di sistema, una variabile di ambiente o le impostazioni di configurazione dell'applicazione. Per utilizzare le impostazioni di configurazione dell'applicazione, è necessario che sia attivata la chiave del Registro di sistema o la variabile di ambiente.

Quando in Visual Studio 2005 e versioni più recenti è attivato il processo di hosting, non è possibile disattivare gli MDA presenti nell'insieme predefinito o attivare quelli non presenti. Il processo di hosting è attivato per impostazione predefinita, pertanto deve essere disattivato in modo esplicito.

Per disattivare il processo di hosting in Visual Studio, effettuare le operazioni seguenti:

  1. Selezionare un progetto in Esplora soluzioni.

  2. Scegliere Proprietà dal menu Progetto.

    Verrà visualizzata la finestra Progettazione progetti.

  3. Fare clic sulla scheda Debug.

  4. Nella sezione Attiva debugger deselezionare la casella di controllo Attiva il processo di hosting di Visual Studio.

La disattivazione del processo di hosting può tuttavia influire sulle prestazioni. È possibile evitare di dover disattivare gli MDA impedendo la visualizzazione in Visual Studio della finestra di dialogo dell'MDA ogni volta che si riceve una notifica dell'MDA. A tale scopo, scegliere Eccezioni dal menu Debug, espandere l'elenco Assistenti al debug gestito, quindi selezionare o deselezionare la casella di controllo Generata per un determinato MDA.

Abilitazione e disabilitazione mediante l'utilizzo di una chiave del Registro di sistema

È possibile abilitare gli assistenti al debug gestito aggiungendo la sottochiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA nel Registro di sistema di Windows. Copiare l'esempio riportato di seguito in un file di testo denominato "MDAEnable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="1"

Dal prompt dei comandi eseguire il file MDAEnable.reg per abilitare gli assistenti al debug gestito nel computer locale. Per disabilitarli, copiare l'esempio riportato di seguito in un file di testo denominato "MDADisable.reg":

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"MDA"="0"

Eseguire quindi il file MDADisable.reg dal prompt dei comandi.

Per impostazione predefinita, alcuni assistenti al debug gestito vengono abilitati quando si esegue l'applicazione associata a un debugger, anche senza aggiungere la chiave del Registro di sistema. Alcuni esempi sono MDA pInvokeStackImbalance e MDA invalidApartmentStateChange. Per disabilitare questi assistenti è possibile eseguire il file MDADisable.reg come descritto sopra.

Abilitazione e disabilitazione mediante l'utilizzo di una variabile di ambiente

L'abilitazione degli assistenti al debug gestito può essere controllata dalla variabile di ambiente COMPLUS_MDA. Questa variabile esegue l'override della chiave del Registro di sistema. La stringa è costituita da un elenco di nomi di assistenti al debug gestito separati da punto e virgola e senza distinzione tra maiuscole e minuscole oppure da altre stringhe di controllo speciali. Per impostazione predefinita, l'avvio in un debugger gestito o non gestito abilita un set di assistenti al debug gestito. Questa operazione viene eseguita anteponendo implicitamente l'elenco di assistenti al debug gestito abilitati automaticamente nei debugger al valore della variabile di ambiente o della chiave del Registro di sistema. Di seguito sono elencate le stringhe di controllo speciali:

  • 0 - Disabilita tutti gli assistenti al debug gestito.

  • 1 - Legge le impostazioni relative agli assistenti al debug gestito dal file NomeApplicazione.mda.config.

  • managedDebugger - Abilita esplicitamente tutti gli assistenti al debug gestito abilitati implicitamente all'avvio di un eseguibile gestito in un debugger.

  • unmanagedDebugger - Abilita esplicitamente tutti gli assistenti al debug gestito abilitati implicitamente all'avvio di un eseguibile non gestito in un debugger.

In caso di conflitti nelle impostazioni, le impostazioni più recenti eseguono l'override di quelle precedenti:

  • COMPLUS_MDA=0 disabilita tutti gli assistenti al debug gestito, inclusi quelli abilitati implicitamente in un debugger.

  • COMPLUS_MDA=gcUnmanagedToManaged abilita gcUnmanagedToManaged oltre agli eventuali assistenti abilitati implicitamente in un debugger.

  • COMPLUS_MDA =0;gcUnmanagedToManaged abilita gcUnmanagedToManaged ma disabilita gli assistenti al debug gestito che verrebbero altrimenti abilitati implicitamente in un debugger.

Abilitazione e disabilitazione mediante l'utilizzo di impostazioni di configurazione specifiche dell'applicazione

È possibile abilitare, disabilitare e configurare singolarmente alcuni assistenti al debug gestito nel file di configurazione degli assistenti dell'applicazione. Per abilitare l'utilizzo di un file di configurazione dell'applicazione per la configurazione degli assistenti al debug gestito, deve essere impostata la chiave del Registro di sistema dell'assistente al debug gestito o la variabile di ambiente COMPLUS_MDA. Questo file si trova in genere nella stessa directory dell'eseguibile dell'applicazione (exe). Il nome del file è in formato NomeApplicazione.mda.config, ad esempio notepad.exe.mda.config. Gli assistenti abilitati nel file di configurazione dell'applicazione possono avere attributi o elementi appositamente progettati per controllare il comportamento dell'assistente. Nell'esempio riportato di seguito viene illustrato come abilitare e configurare l'MDA marshaling.

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

Queste impostazioni abilitano e configurano l'assistente al debug gestito Marshaling, che invia informazioni relative al tipo gestito di cui viene eseguito il marshalling in un tipo non gestito per ciascuna transizione da codice gestito a non gestito nell'applicazione. L'assistente al debug gestito Marshaling offre un'ulteriore flessibilità per filtrare il nome dei campi di metodi e strutture forniti rispettivamente negli elementi figlio <methodFilter> e <fieldFilter>.

Per ulteriori informazioni sulle impostazioni specifiche di ciascun assistente al debug gestito, consultare la relativa documentazione.

Output degli assistenti al debug gestito

L'output degli assistenti al debug gestito è simile quello indicato all'esempio riportato di seguito, in cui è illustrato l'output dell'assistente pInvokeStackImbalance.

A call to PInvoke function 'MDATest!MDATest.Program::StdCall' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Vedere anche

Altre risorse

Esecuzione del debug e creazione del profilo delle applicazioni

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Aggiunta una nota su come evitare il messaggio ContextSwitchDeadlock.

Commenti e suggerimenti dei clienti.