Condividi tramite


Diagnosticare gli errori tramite gli assistenti al debug gestito

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluso .NET 6 e versioni successive.

Gli assistenti al debug gestito sono strumenti per il debug che collaborano con CLR (Common Language Runtime) per fornire informazioni sullo stato del runtime. Gli assistenti generano messaggi informativi su eventi di runtime che non possono essere intercettati in altro modo. È possibile usare gli assistenti al debug gestito per isolare bug di applicazione difficili da individuare, che si verificano durante la transizione tra codice gestito e non gestito.

È possibile abilitare o disabilitare tutti gli assistenti al debug gestito aggiungendo una chiave al Registro di sistema di Windows oppure impostando una variabile di ambiente. Le impostazioni di configurazione dell'applicazione permettono di abilitare assistenti al debug gestito specifici. È possibile definire impostazioni di configurazione aggiuntive per alcuni singoli assistenti al debug gestito nel file di configurazione dell'applicazione. Poiché questi file di configurazione sono analizzati durante il caricamento del runtime, è necessario abilitare l'assistente al debug gestito prima dell'avvio dell'applicazione gestita. Non è possibile abilitarlo per applicazioni già avviate.

Nella tabella seguente sono elencati gli assistenti al debug gestito disponibili in .NET Framework:

Assistente al debug gestito
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
marshaling
memberInfoCacheCreation
moduloObjectHashcode
nonComVisibleBaseClass
notMarshalable
openGenericCERCall
overlappedFreeError
pInvokeLog
pInvokeStackImbalance
raceOnRCWCleanup
reentrancy
releaseHandleFailed
reportAvOnComRelease
streamWriterBufferedDataLost
virtualCERCall

Per impostazione predefinita, .NET Framework attiva un sottoinsieme di assistenti al debug gestito per tutti i debugger gestiti. È possibile visualizzare il set predefinito in Visual Studio scegliendo Finestre>Impostazioni eccezioni dal menu Debug ed espandendo l'elenco Assistenti al debug gestito.

Finestra Impostazioni eccezioni in Visual Studio

Abilitare e disabilitare gli assistenti al debug gestito

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

Suggerimento

Invece di disabilitare gli assistenti al debug gestito, è possibile impedire a Visual Studio di visualizzare la finestra di dialogo relativa all'assistente al debug gestito quando si riceve una notifica. A tale scopo, scegliere Finestre>Impostazioni eccezioni dal menu Debug, espandere l'elenco Assistenti al debug gestito e quindi selezionare o deselezionare la casella di controllo Interrompi se generata per il singolo assistente al debug gestito.

Chiave del Registro di sistema

Per abilitare gli assistenti al debug gestito, aggiungere la sottochiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (tipo REG_SZ, valore 1) al Registro di sistema di Windows. Copiare l'esempio seguente in un file di testo denominato MDAEnable.reg. Aprire l'editor del Registro di sistema di Windows (RegEdit.exe) e scegliere Importa dal menu File. Selezionare il file MDAEnable.reg per abilitare l'assistente al debug gestito in tale computer. Se si imposta la sottochiave sul valore stringa 1 (non il valore DWORD 1), verrà abilitata la lettura delle impostazioni dell'assistente al debug gestito dal file ApplicationName.suffix.mda.config. Ad esempio il nome del file di configurazione dell'assistente al debug gestito per Blocco note sarà notepad.exe.mda.config.

Windows Registry Editor Version 5.00

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

Se il computer esegue un'applicazione a 32 bit in un sistema operativo a 64 bit, la chiave dell'assistente al debug gestito deve essere configurata come segue:

Windows Registry Editor Version 5.00

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

Per altre informazioni, vedere Impostazioni di configurazione specifiche dell'applicazione. L'impostazione del Registro di sistema può essere sostituita dalla variabile di ambiente COMPLUS_MDA. Per altre informazioni, vedere Variabile di ambiente.

Per disabilitare gli assistenti al debug gestito, impostare la sottochiave MDA su 0 (zero) usando l'editor del Registro di sistema di Windows.

Per impostazione predefinita, alcuni assistenti al debug gestito sono abilitati quando si esegue un'applicazione associata a un debugger, anche se non si aggiunge la chiave del Registro di sistema, È possibile disabilitare questi assistenti eseguendo il file MDADisable.reg, come descritto in precedenza in questa sezione.

Variabile di ambiente

L'attivazione dell'assistente al debug gestito può essere controllata anche dalla variabile di ambiente COMPLUS_MDA, che sostituisce la chiave del Registro di sistema. La stringa COMPLUS_MDA è un elenco di nomi di assistenti al debug gestito o di altre stringhe di controllo speciali delimitato da punto e virgola e senza distinzione tra maiuscole e minuscole. L'avvio con un debugger gestito o non gestito abilita un set di assistenti al debug gestito per impostazione predefinita, aggiungendo in modo implicito l'elenco delimitato da punto e virgola di assistenti al debug gestito abilitati per impostazione predefinita con i debugger davanti al valore della variabile di ambiente o della chiave del Registro di sistema. Di seguito sono elencate le stringhe di controllo speciali:

  • 0 - Disattiva tutti gli assistenti al debug gestito.

  • 1: legge le impostazioni dell'assistente al debug gestito da NomeApplicazione.mda.config.

  • managedDebugger - Attiva esplicitamente tutti gli assistenti al debug gestito attivati in modo implicito quando si avvia un eseguibile gestito con un debugger.

  • unmanagedDebugger - Attiva esplicitamente tutti gli assistenti al debug gestito attivati in modo implicito quando si avvia un eseguibile non gestito con un debugger.

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

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

  • COMPLUS_MDA=gcUnmanagedToManaged abilita gcUnmanagedToManaged, oltre a eventuali assistenti al debug gestito abilitati in modo implicito con un debugger.

  • COMPLUS_MDA=0;gcUnmanagedToManaged abilita gcUnmanagedToManaged ma disabilita gli assistenti al debug gestito che sarebbero altrimenti abilitati in modo implicito con un debugger.

Impostazioni di configurazione specifiche dell'applicazione

È possibile abilitare, disabilitare e configurare individualmente alcuni assistenti nel file di configurazione MDA per l'applicazione. Per abilitare l'uso di un file di configurazione dell'applicazione per configurare gli assistenti al debug gestito, è necessario impostare la chiave del Registro di sistema MDA o la variabile di ambiente COMPLUS_MDA. Il file di configurazione dell'applicazione si trova in genere nella stessa directory del file eseguibile (con estensione exe) dell'applicazione. Il formato del nome del file è NomeApplicazione.mda.config. Ad esempio, blocconote.exe.mda.config. Gli assistenti abilitati nel file di configurazione dell'applicazione potrebbero disporre di attributi o elementi progettati per il controllo del comportamento dell'assistente.

L'esempio seguente mostra come abilitare e configurare il marshalling:

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

L'assistente Marshaling emette informazioni sul tipo gestito di cui si sta effettuando il marshalling a un tipo non gestito per ogni transizione da gestito a non gestito nell'applicazione. L'assistente al debug gestito Marshaling può anche filtrare i nomi dei campi metodo e struttura forniti rispettivamente negli elementi figlio methodFilter e fieldFilter.

L'esempio seguente mostra come abilitare più assistenti al debug gestito usando le rispettive impostazioni predefinite:

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

Importante

Se si specifica più di un assistente in un file di configurazione, è necessario elencarli in ordine alfabetico. Ad esempio, per abilitare gli assistenti virtualCERCall e invalidCERCall, è necessario aggiungere la voce <invalidCERCall /> prima della voce <virtualCERCall />. Se le voci non sono in ordine alfabetico, sarà visualizzato un messaggio relativo a un'eccezione non gestita per file di configurazione non valido.

Eccezioni degli assistenti al debug gestito

Quando un assistente al debug gestito è abilitato, sarà attivo anche quando il codice non è in esecuzione in un debugger. Se un evento dell'assistente al debug gestito è generato quando non è presente alcun debugger, il messaggio relativo all'evento è visualizzato in una finestra di dialogo per eccezioni non gestite, anche se non si tratta di un'eccezione non gestita. Per evitare la visualizzazione della finestra di dialogo, rimuovere l'impostazione per l'abilitazione dell'assistente al debug gestito quando il codice non è in esecuzione in un ambiente di debug.

Quando il codice viene eseguito nell'ambiente di sviluppo integrato (IDE, Integrated Development Environment) di Visual Studio, è possibile evitare la finestra di dialogo per le eccezioni visualizzata per eventi specifici dell'assistente al debug gestito. A tale scopo, scegliere Finestre>Impostazioni eccezioni dal menu Debug. Nella finestra Impostazioni eccezioni espandere l'elenco Assistenti al debug gestito e quindi deselezionare la casella di controllo Interrompi se generata per il singolo assistente al debug gestito. È anche possibile usare questa finestra di dialogo per abilitare la visualizzazione delle finestre di dialogo per le eccezioni dell'assistente al debug gestito.

Output degli assistenti al debug gestito

L'output degli assistenti al debug gestito è analogo all'esempio seguente, che mostra l'output dall'assistente PInvokeStackImbalance:

Una chiamata alla funzione PInvoke 'MDATest! MDATest.Program::StdCall' ha sbilanciato lo stack. La causa probabile è che la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma non gestita di destinazione.

Vedi anche