Condividi tramite


Diagnostica degli errori tramite gli assistenti al debug gestito

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.

NotaNota

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.

NotaNota

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

callbackOnCollectedDelegate (MDA)

MDA contextSwitchDeadlock

MDA dangerousThreadingAPI

dateTimeInvalidLocalFormat (MDA)

MDA dirtyCastAndCallOnInterface

MDA disconnectedContext

MDA dllMainReturnsFalse

MDA exceptionSwallowedOnCallFromCom

MDA failedQI

MDA fatalExecutionEngineError

MDA gcManagedToUnmanaged

MDA gcUnmanagedToManaged

MDA illegalPrepareConstrainedRegion

MDA invalidApartmentStateChange

MDA invalidCERCall

invalidFunctionPointerInDelegate (MDA)

MDA invalidGCHandleCookie

MDA invalidIUnknown

MDA invalidMemberDeclaration

MDA invalidOverlappedToPinvoke

MDA invalidVariant

MDA jitCompilationStart

MDA loaderLock

MDA loadFromContext

MDA marshalCleanupError

MDA marshaling

MDA memberInfoCacheCreation

moduloObjectHashcode (MDA)

nonComVisibleBaseClass (MDA)

notMarshalable (MDA)

openGenericCERCall (MDA)

MDA overlappedFreeError

MDA pInvokeLog

MDA pInvokeStackImbalance

MDA raceOnRCWCleanup

rientranza (MDA)

releaseHandleFailed (MDA)

MDA reportAvOnComRelease

streamWriterBufferedDataLost (MDA)

virtualCERCall (MDA)

Per impostazione predefinita, in .NET Framework viene attivato un subset di MDA per tutti i debugger gestiti. È possibile visualizzare il set 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 disabilitare gli MDA presenti nel set predefinito o attivare quelli non presenti. Il processo di hosting è attivato per impostazione predefinita, pertanto deve essere disabilitato in modo esplicito.

Per disabilitare 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 disabilitazione del processo di hosting può tuttavia influire sulle prestazioni. È possibile evitare di dover disabilitare 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 degli MDA mediante una chiave del Registro di sistema

È possibile abilitare gli MDA aggiungendo la sottochiave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (tipo REG_SZ, valore 1)nel Registro di sistema di Windows. Copiare l'esempio seguente in un file di testo denominato MDAEnable.reg e fare doppio clic sul nome file in Esplora risorse per abilitare gli MDA in quel computer.

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

Per disabilitare gli MDA, impostare la sottochiave MDA su 0 (zero) utilizzando l'editor del Registro di sistema di Windows. In alternativa, è possibile copiare l'esempio seguente in un file di testo denominato MDADisable.reg e fare doppio clic sul nome file in Esplora risorse.

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

Per impostazione predefinita, alcuni MDA vengono abilitati quando si esegue un'applicazione associata a un debugger, anche senza aggiungere la chiave del Registro di sistema. Alcuni esempi sono MDA pInvokeStackImbalance e MDA invalidApartmentStateChange. È possibile disabilitare questi assistenti eseguendo il file MDADisable.reg come descritto in precedenza in questa sezione.

Abilitazione e disabilitazione degli MDA mediante una variabile di ambiente

L'attivazione degli MDA può anche essere controllata mediante la variabile di ambiente COMPLUS_MDA, che esegue l'override della chiave del Registro di sistema. La stringa COMPLUS_MDA è un elenco di nomi di MDA o altre stringhe di controllo speciali separati da punto e virgola e senza distinzione tra maiuscole e minuscole. Per impostazione predefinita, l'avvio in un debugger gestito o non gestito abilita un set di assistenti al debug gestito. A tale scopo, si antepone implicitamente l'elenco di MDA separati da punto e virgola abilitati per impostazione predefinita 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 MDA, inclusi quelli abilitati implicitamente in un debugger.

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

  • COMPLUS_MDA=0;gcUnmanagedToManaged abilita gcUnmanagedToManaged ma disabilita gli MDA che altrimenti verrebbero abilitati implicitamente in un debugger.

Abilitazione e disabilitazione degli MDA mediante 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. Il file di configurazione dell'applicazione si trova in genere nella stessa directory del file eseguibile (con estensione exe) dell'applicazione. Il nome file assume il formato NomeApplicazione.mda.config; ad esempio, notepad.exe.mda.config. Gli assistenti abilitati nel file di configurazione dell'applicazione possono disporre di attributi o elementi specificatamente progettati per controllare il comportamento degli assistenti. 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>

L'MDA Marshaling invia informazioni relative al tipo gestito di cui viene eseguito il marshalling in un tipo non gestito per ciascuna transizione da gestito a non gestito nell'applicazione. L'MDA Marshaling può inoltre filtrare i nomi dei campi di metodi e strutture forniti rispettivamente negli elementi figlio <methodFilter> e <fieldFilter>.

Nell'esempio seguente viene mostrato come abilitare più MDA mediante le impostazioni predefinite.

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

Quando si specificano più assistenti in un file di configurazione, è necessario elencarli in ordine alfabetico.Ad esempio, se si desidera abilitare sia l'MDA virtualCERCall che l'MDA invalidCERCall, è necessario aggiungere la voce <invalidCERCall /> prima della voce <virtualCERCall />.Se le voci non sono in ordine alfabetico, verrà visualizzato un messaggio di eccezione del file di configurazione non valido che non è stato gestito.

Output degli MDA

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

Debug, traccia e profilatura