Diagnostic d'erreurs avec les Assistants de débogage managés

Les Assistants Débogage managé (MDA) sont des outils de débogage qui fonctionnent conjointement avec le Common Language Runtime (CLR) pour fournir des informations sur l'état du runtime. Les Assistants génèrent des messages d'information à propos d'événements du runtime qui, sinon, sont impossibles à intercepter. Vous pouvez les utiliser pour isoler des bogues d'application difficilement détectables qui se produisent au cours de la transition entre le code managé et le code non managé. Vous pouvez activer ou désactiver tous les Assistants Débogage managé en ajoutant une clé au Registre Windows ou en définissant une variable d'environnement. Vous pouvez activer des Assistants Débogage managé spécifiques en utilisant des paramètres de configuration d'application. Vous pouvez définir des paramètres de configuration supplémentaires pour certains d'entre eux dans le fichier de configuration de l'application. Dans la mesure où ces fichiers de configuration sont analysés au moment du chargement du runtime, vous devez activer l'Assistant Débogage managé avant le démarrage de l'application managée. Vous ne pouvez pas l'activer pour des applications déjà démarrées.

RemarqueRemarque

Lorsqu'il est activé, un MDA est actif même si votre code n'est pas exécuté dans un débogueur.Si un événement MDA est déclenché lorsqu'un débogueur n'est pas présent, le message d'événement s'affiche dans une boîte de dialogue d'exception non gérée, bien qu'il ne s'agisse pas d'une exception non gérée.Pour que la boîte de dialogue n'apparaisse plus, supprimez les paramètres d'activation du MDA lorsque votre code n'est pas exécuté dans un environnement de débogage.

RemarqueRemarque

Lorsque votre code s'exécute dans l'environnement de développement intégré Visual Studio (IDE), vous pouvez empêcher la boîte de dialogue d'exception de s'afficher pour des événements MDA spécifiques.Pour ce faire, dans le menu Déboguer, cliquez sur Exceptions.Si le menu Déboguer ne contient pas la commande Exceptions, cliquez sur Personnaliser dans le menu Outils pour l'ajouter. Dans la boîte de dialogue Exceptions, développez la liste Assistant débogage managé, puis désactivez la case à cocher Levé pour le MDA individuel.Par exemple, pour empêcher la boîte de dialogue d'exception pour un Assistant Débogage managé contextSwitchDeadlock de s'afficher, désactivez la case à cocher Levé en regard de son nom dans la liste Assistant débogage managé.Vous pouvez également utiliser cette boîte de dialogue pour activer des MDA.

Le tableau suivant répertorie les Assistants Débogage managé fournis avec le .NET Framework.

Assistant Débogage managé asynchronousThreadAbort

Assistant Débogage managé bindingFailure

callbackOnCollectedDelegate (MDA)

Assistant Débogage managé contextSwitchDeadlock

Assistant Débogage managé dangerousThreadingAPI

dateTimeInvalidLocalFormat (MDA)

Assistant Débogage managé dirtyCastAndCallOnInterface

Assistant Débogage managé disconnectedContext

Assistant Débogage managé dllMainReturnsFalse

Assistant Débogage managé exceptionSwallowedOnCallFromCom

Assistant Débogage managé failedQI

Assistant Débogage managé fatalExecutionEngineError

Assistant Débogage managé gcManagedToUnmanaged

Assistant Débogage managé gcUnmanagedToManaged

Assistant Débogage managé illegalPrepareConstrainedRegion

Assistant Débogage managé invalidApartmentStateChange

Assistant Débogage managé invalidCERCall

invalidFunctionPointerInDelegate (MDA)

Assistant Débogage managé invalidGCHandleCookie

Assistant Débogage managé invalidIUnknown

Assistant Débogage managé invalidMemberDeclaration

Assistant Débogage managé invalidOverlappedToPinvoke

Assistant Débogage managé invalidVariant

Assistant Débogage managé jitCompilationStart

Assistant Débogage managé loaderLock

Assistant Débogage managé loadFromContext

Assistant Débogage managé marshalCleanupError

Assistant Débogage managé marshaling

Assistant Débogage managé memberInfoCacheCreation

moduloObjectHashcode (MDA)

nonComVisibleBaseClass (MDA)

notMarshalable (MDA)

openGenericCERCall (MDA)

Assistant Débogage managé overlappedFreeError

Assistant Débogage managé pInvokeLog

Assistant Débogage managé pInvokeStackImbalance

Assistant Débogage managé raceOnRCWCleanup

réentrance (MDA)

releaseHandleFailed (MDA)

Assistant Débogage managé reportAvOnComRelease

streamWriterBufferedDataLost (MDA)

virtualCERCall (MDA)

Par défaut, le .NET Framework active un sous-ensemble de MDA pour tous les débogueurs managés. Vous pouvez consulter le jeu par défaut dans Visual Studio en cliquant sur Exceptions dans le menu Déboguer et en développant la liste Assistant Débogage managé.

Activation et désactivation des Assistants Débogage managé

Vous pouvez activer et désactiver ces Assistants à l'aide d'une clé de Registre, d'une variable d'environnement et des paramètres de configuration d'application. Vous devez activer la clé de Registre ou la variable d'environnement pour utiliser les paramètres de configuration de l'application.

Dans Visual Studio 2005 et versions ultérieures, lorsque le processus d'hébergement est activé, vous ne pouvez pas désactiver les MDA qui se trouvent dans le jeu par défaut ni activer ceux qui n'y figurent pas. Le processus d'hébergement étant activé par défaut, il doit être désactivé explicitement.

Pour désactiver le processus d'hébergement dans Visual Studio, procédez comme suit :

  1. Dans l'Explorateur de solutions, sélectionnez un projet.

  2. Dans le menu Projet, cliquez sur Propriétés.

    La fenêtre Concepteur de projets apparaît.

  3. Cliquez sur l'onglet Débogage.

  4. Dans la section Activer les débogueurs, désactivez la case à cocher Activer le processus d'hébergement Visual Studio.

Toutefois, la désactivation du processus d'hébergement peut affecter les performances. Vous pouvez éviter de désactiver les MDA en empêchant Visual Studio d'afficher la boîte de dialogue MDA dès qu'une notification MDA est reçue. Pour ce faire, cliquez sur Exceptions dans le menu Déboguer, développez la liste Assistant Débogage managé, puis sélectionnez ou désactivez la case à cocher Levé pour chaque MDA.

Activation et désactivation des Assistants Débogage managé à l'aide d'une clé de Registre

Vous pouvez activer les Assistants Débogage managé en ajoutant la sous-clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA (type REG_SZ, valeur 1) dans le Registre Windows. Copiez l'exemple suivant dans un fichier texte nommé MDAEnable.reg et double-cliquez sur le nom du fichier dans l'Explorateur Windows pour activer les Assistants sur cet ordinateur.

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

Pour désactiver les Assistants Débogage managé, affectez la valeur 0 (zéro) à la sous-clé MDA à l'aide de l'Éditeur de Registre Windows. Vous pouvez également copier l'exemple suivant dans un fichier texte nommé MDADisable.reg et double-cliquer sur le nom du fichier dans l'Explorateur Windows.

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

Par défaut, certains Assistants Débogage managé sont activés lorsque vous exécutez une application attachée à un débogueur, même si vous n'avez pas ajouté la clé de Registre. Assistant Débogage managé pInvokeStackImbalance et Assistant Débogage managé invalidApartmentStateChange sont deux exemples d'Assistants Débogage managé. Vous pouvez désactiver ces Assistants en exécutant le fichier MDADisable.reg, comme indiqué précédemment dans cette section.

Activation et désactivation des Assistants Débogage managé à l'aide d'une variable d'environnement

Vous pouvez également contrôler l'activation des Assistants Débogage managé via la variable d'environnement COMPLUS_MDA, qui se substitue à la clé de Registre. La chaîne COMPLUS_MDA est une liste de noms MDA ou d'autres chaînes de contrôle spéciales qui est délimitée par des points-virgules et ne respecte pas la casse. Le démarrage sous un débogueur managé ou non managé active par défaut un ensemble d'Assistants Débogage managé. Cette opération est effectuée en ajoutant implicitement la liste délimitée par des points-virgules des Assistants Débogage managé activés par défaut sous des débogueurs à la valeur de la variable d'environnement ou de la clé de Registre. Les chaînes de contrôle spéciales sont les suivantes :

  • 0 - Désactive tous les Assistants Débogage managé.

  • 1 - Lit les paramètres MDA à partir du fichier ApplicationName.mda.config.

  • managedDebugger - Active explicitement tous les Assistants Débogage managé activés implicitement lors du démarrage d'un fichier exécutable managé sous un débogueur.

  • unmanagedDebugger - Active explicitement tous les Assistants Débogage managé activés implicitement lors du démarrage d'un fichier exécutable non managé sous un débogueur.

En présence de paramètres incompatibles, les paramètres les plus récents se substituent aux paramètres antérieurs :

  • COMPLUS_MDA=0 désactive tous les Assistants Débogage managé, y compris ceux implicitement activés sous un débogueur.

  • COMPLUS_MDA=gcUnmanagedToManaged active gcUnmanagedToManaged, en plus des Assistants Débogage managé implicitement activés sous un débogueur.

  • COMPLUS_MDA=0;gcUnmanagedToManaged active gcUnmanagedToManaged, mais désactive tous les Assistants Débogage managé qui seraient implicitement activés sous un débogueur.

Activation et désactivation des Assistants Débogage managé à l'aide de paramètres de configuration spécifiques à l'application

Vous pouvez activer, désactiver et configurer individuellement certains Assistants dans le fichier de configuration MDA de l'application. Pour activer l'utilisation d'un fichier de configuration de l'application en vue de configurer des Assistants Débogage managé, la clé de Registre MDA ou la variable d'environnement COMPLUS_MDA doit être définie. Le fichier de configuration d'une application se trouve généralement dans le même répertoire que le fichier exécutable (.exe) de l'application. Le nom du fichier se présente sous la forme NomApplication.mda.config  (par exemple, notepad.exe.mda.config). Les assistants qui sont activés dans le fichier de configuration d'une application peuvent avoir des attributs ou des éléments conçus spécifiquement pour contrôler le comportement de cet assistant. L'exemple suivant montre comment activer et configurer Assistant Débogage managé marshaling.

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

L'Assistant Débogage managé Marshaling émet des informations sur le type managé qui est marshalé en type non managé pour chaque transition d'un type managé à un type non managé dans l'application. Il peut également filtrer les noms de la méthode et des structures de champ fournis respectivement dans les éléments enfants <methodFilter> et <fieldFilter>

L'exemple suivant montre comment activer plusieurs Assistants Débogage managé à l'aide de leurs paramètres par défaut.

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

Lorsque vous spécifiez plusieurs Assistants dans un fichier de configuration, vous devez les répertorier par ordre alphabétique.Par exemple, si vous voulez activer à la fois les Assistants virtualCERCall et invalidCERCall, vous devez ajouter l'entrée <invalidCERCall /> avant l'entrée <virtualCERCall />.Si les entrées ne sont pas dans l'ordre alphabétique, un message d'exception de fichier de configuration non valide et non géré est affiché.

Sortie de l'Assistant Débogage managé

La sortie de l'Assistant Débogage managé est similaire à celle proposée dans l'exemple suivant, qui affiche la sortie de l'Assistant Débogage managé 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.

Voir aussi

Autres ressources

Débogage, traçage et profilage