Diagnostiquer les erreurs avec les assistants débogage managésDiagnose Errors with Managed Debugging Assistants

Les Assistants Débogage managé sont des aides au débogage qui fonctionnent conjointement avec le Common Language Runtime (CLR) pour fournir des informations sur l'état d'exécution.Managed debugging assistants (MDAs) are debugging aids that work in conjunction with the common language runtime (CLR) to provide information on runtime state. Les Assistants génèrent des messages d'information sur les événements du runtime que vous ne pouvez pas intercepter en temps normal.The assistants generate informational messages about runtime events that you cannot otherwise trap. Vous pouvez utiliser les Assistants Débogage managé pour isoler les bogues d'application difficiles à déceler qui se produisent pendant les phases de transition entre un code managé et un code non managé.You can use MDAs to isolate hard-to-find application bugs that occur when transitioning between managed and unmanaged code.

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.You can enable or disable all MDAs by adding a key to the Windows registry or by setting an environment variable. Vous pouvez activer des Assistants Débogage managé spécifiques à l'aide de paramètres de configuration d'application.You can enable specific MDAs by using application configuration settings. Vous pouvez définir des paramètres de configuration supplémentaires pour certains Assistants Débogage managé dans le fichier de configuration de l'application.You can set additional configuration settings for some individual MDAs in the application's configuration file. Comme ces fichiers de configuration sont analysés au chargement du runtime, vous devez activer l'Assistant Débogage managé avant que l'application managée ne démarre.Because these configuration files are parsed when the runtime is loaded, you must enable the MDA before the managed application starts. Vous ne pouvez pas l'activer pour les applications qui ont déjà démarré.You cannot enable it for applications that have already started.

Le tableau suivant répertorie les MDA fournis avec l' .NET Framework :The following table lists the MDAs that ship with the .NET Framework:

asynchronousThreadAbortasynchronousThreadAbort bindingFailurebindingFailure
callbackOnCollectedDelegatecallbackOnCollectedDelegate contextSwitchDeadlockcontextSwitchDeadlock
dangerousThreadingAPIdangerousThreadingAPI dateTimeInvalidLocalFormatdateTimeInvalidLocalFormat
dirtyCastAndCallOnInterfacedirtyCastAndCallOnInterface disconnectedContextdisconnectedContext
dllMainReturnsFalsedllMainReturnsFalse exceptionSwallowedOnCallFromComexceptionSwallowedOnCallFromCom
failedQIfailedQI fatalExecutionEngineErrorfatalExecutionEngineError
gcManagedToUnmanagedgcManagedToUnmanaged gcUnmanagedToManagedgcUnmanagedToManaged
illegalPrepareConstrainedRegionillegalPrepareConstrainedRegion invalidApartmentStateChangeinvalidApartmentStateChange
invalidCERCallinvalidCERCall invalidFunctionPointerInDelegateinvalidFunctionPointerInDelegate
invalidGCHandleCookieinvalidGCHandleCookie invalidIUnknowninvalidIUnknown
invalidMemberDeclarationinvalidMemberDeclaration invalidOverlappedToPinvokeinvalidOverlappedToPinvoke
invalidVariantinvalidVariant jitCompilationStartjitCompilationStart
loaderLockloaderLock loadFromContextloadFromContext
marshalCleanupErrormarshalCleanupError marshalingmarshaling
memberInfoCacheCreationmemberInfoCacheCreation moduloObjectHashcodemoduloObjectHashcode
nonComVisibleBaseClassnonComVisibleBaseClass notMarshalablenotMarshalable
openGenericCERCallopenGenericCERCall overlappedFreeErroroverlappedFreeError
pInvokeLogpInvokeLog pInvokeStackImbalancepInvokeStackImbalance
raceOnRCWCleanupraceOnRCWCleanup reentrancyreentrancy
releaseHandleFailedreleaseHandleFailed reportAvOnComReleasereportAvOnComRelease
streamWriterBufferedDataLoststreamWriterBufferedDataLost virtualCERCallvirtualCERCall

Par défaut, le .NET Framework active une partie des Assistants Débogage managé pour tous les débogueurs managés.By default, the .NET Framework activates a subset of MDAs for all managed debuggers. Vous pouvez afficher l’ensemble par défaut dans Visual Studio en choisissantparamètres des exceptions Windows > dans le menu Déboguer , puis en développant la liste assistants de débogage managés .You can view the default set in Visual Studio by choosing Windows > Exception Settings on the Debug menu, and then expanding the Managed Debugging Assistants list.

Fenêtre Paramètres d’exception dans Visual Studio

Activer et désactiver les Assistants Débogage managéEnable and Disable MDAs

Vous pouvez activer et désactiver les Assistants Débogage managé en utilisant une clé de Registre, une variable d'environnement et des paramètres de configuration d'application.You can enable and disable MDAs by using a registry key, an environment variable, and application configuration settings. Vous devez activer la clé de Registre ou la variable d'environnement pour utiliser les paramètres de configuration d'application.You must enable either the registry key or the environment variable to use the application configuration settings.

Conseil

Au lieu de désactiver les MDA, vous pouvez empêcher Visual Studio d’afficher la boîte de dialogue Assistant Débogage managé chaque fois qu’une notification MDA est reçue.Instead of disabling MDAs, you can prevent Visual Studio from displaying the MDA dialog box whenever an MDA notification is received. Pour ce faire, choisissez Paramètres des exceptions Windows > dans le menu Déboguer , développez la liste Assistants Débogage managé , puis activez ou désactivez la case à cocher arrêter la levée en cas d'exception pour le MDA individuel.To do that, choose Windows > Exception Settings on the Debug menu, expand the Managed Debugging Assistants list, and then select or clear the Break When Thrown check box for the individual MDA.

Clé de RegistreRegistry Key

Pour activer les MDA, ajoutez HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\. Sous-clé NETFramework\MDA (type REG_SZ, valeur 1) dans le Registre Windows.To enable MDAs, add the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\MDA subkey (type REG_SZ, value 1) in the Windows registry. Copiez l’exemple suivant dans un fichier texte nommé MDAEnable. reg. Ouvrez l’éditeur du Registre Windows (RegEdit. exe), puis, dans le menu fichier , choisissez Importer.Copy the following example into a text file named MDAEnable.reg. Open the Windows Registry Editor (RegEdit.exe), and from the File menu choose Import. Sélectionnez le fichier MDAEnable. reg pour activer les MDA sur cet ordinateur.Select the MDAEnable.reg file to enable MDAs on that computer. La définition de la sous-clé sur la valeur de chaîne 1 (pas la valeur DWORD 1) active la lecture des paramètres MDA à partir du fichier applicationName. suffixe. MDA. config.Setting the subkey to string value of 1 (not DWORD value of 1) enables the reading of MDA settings from the ApplicationName.suffix.mda.config file. Par exemple, le fichier de configuration MDA pour le bloc-notes est nommé Notepad. exe. MDA. config.For example, the MDA configuration file for Notepad would be named notepad.exe.mda.config.

Windows Registry Editor Version 5.00

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

Si l'ordinateur exécute une application 32 bits sur un système d'exploitation 64 bits, la clé MDA doit être définie comme suit :If the computer is running a 32-bit application on a 64-bit operating system, then the MDA key should be set like the following:

Windows Registry Editor Version 5.00

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

Pour plus d’informations, consultez paramètres de configuration spécifiques à l’application.See Application-Specific Configuration Settings for more information. Le paramétrage du Registre peut être remplacé par la variable d'environnement COMPLUS_MDA.The registry setting can be overridden by the COMPLUS_MDA environment variable. Pour plus d’informations, consultez variable d’environnement .See Environment Variable for more information.

Pour désactiver les MDA, définissez la sous-clé de l’Assistant Débogage managé sur 0 (zéro) à l’aide de l’éditeur du Registre Windows.To disable MDAs, set the MDA subkey to 0 (zero) using the Windows Registry Editor.

Par défaut, certains Assistants Débogage managé sont activés quand vous exécutez une application qui est attachée à un débogueur, même sans que la clé de Registre soit ajoutée.By default, some MDAs are enabled when you run an application that is attached to a debugger, even without adding the registry key. Vous pouvez désactiver ces assistants en exécutant le fichier MDADisable. reg comme décrit précédemment dans cette section.You can disable these assistants by running the MDADisable.reg file as described earlier in this section.

Variable d’environnementEnvironment Variable

L'activation des Assistants Débogage managé peut également être contrôlée par la variable d'environnement COMPLUS_MDA, qui remplace la clé de Registre.MDA activation can also controlled by the environment variable COMPLUS_MDA, which overrides the registry key. La chaîne COMPLUS_MDA est une liste de noms d'Assistant Débogage managé ou d'autres chaînes de contrôle spéciales séparés par des points-virgules et sans distinction minuscules/majuscules.The COMPLUS_MDA string is a case-insensitive, semicolon-delimited list of MDA names or other special control strings. Démarrer sous un débogueur managé ou non managé active par défaut un ensemble d'Assistants Débogage managé.Starting under a managed or unmanaged debugger enables a set of MDAs by default. Pour ce faire, la valeur de la variable d'environnement ou de la clé de Registre doit être implicitement ajoutée au début de la liste délimitée par des points-virgules qui répertorie les Assistants Débogage managé activés par défaut sous les débogueurs.This is done by implicitly prepending the semicolon-delimited list of MDAs enabled by default under debuggers to the value of the environment variable or registry key. Les chaînes de contrôle spéciales sont les suivantes :The special control strings are the following:

  • 0 : désactive tous les Assistants Débogage managé.0 - Deactivates all MDAs.

  • 1 : lit les paramètres d’Assistant Débogage managé dans le fichier nom_application.mda.config.1 - Reads MDA settings from ApplicationName.mda.config.

  • managedDebugger : active explicitement tous les Assistants Débogage managé qui sont implicitement activés quand un exécutable managé est démarré sous un débogueur.managedDebugger - Explicitly activates all MDAs that are implicitly activated when a managed executable is started under a debugger.

  • unmanagedDebugger : active explicitement tous les Assistants Débogage managé qui sont implicitement activés quand un exécutable non managé est démarré sous un débogueur.unmanagedDebugger - Explicitly activates all MDAs that are implicitly activated when an unmanaged executable is started under a debugger.

En cas de conflit de paramètres, les paramètres les plus récents remplacent les paramètres antérieurs :If there are conflicting settings, the most recent settings override previous settings:

  • COMPLUS_MDA=0 désactive tous les Assistants Débogage managé, y compris ceux qui sont implicitement activés sous un débogueur.COMPLUS_MDA=0 disables all MDAs, including those implicitly enabled under a debugger.

  • COMPLUS_MDA=gcUnmanagedToManaged active gcUnmanagedToManaged outre tout Assistant Débogage managé implicitement activé sous un débogueur.COMPLUS_MDA=gcUnmanagedToManaged enables gcUnmanagedToManaged in addition to any MDAs that are implicitly enabled under a debugger.

  • COMPLUS_MDA=0;gcUnmanagedToManaged active gcUnmanagedToManaged, mais désactive tout Assistant Débogage managé implicitement activé sous un débogueur.COMPLUS_MDA=0;gcUnmanagedToManaged enables gcUnmanagedToManaged but disables MDAs that would otherwise be implicitly enabled under a debugger.

Paramètres de configuration spécifiques à l’applicationApplication-Specific Configuration Settings

Vous pouvez activer, désactiver et configurer certains Assistants séparément dans le fichier de configuration d'Assistant Débogage managé propre à l'application.You can enable, disable, and configure some assistants individually in the MDA configuration file for the application. Vous ne pouvez utiliser un fichier de configuration d'application pour configurer des Assistants Débogage managé que si la clé de Registre MDA ou la variable d'environnement COMPLUS_MDA est définie.To enable the use of an application configuration file for configuring MDAs, either the MDA registry key or the COMPLUS_MDA environment variable must be set. En règle générale, le fichier de configuration d'application se trouve dans le même répertoire que le fichier exécutable (.exe) de l'application.The application configuration file is typically located in the same directory as the application's executable (.exe) file. Le format du nom de fichier est nom_application.mda.config ; par exemple, notepad.exe.mda.config. Les Assistants qui sont activés dans le fichier de configuration d'application peuvent avoir des attributs ou des éléments qui permettent de contrôler le comportement de l'Assistant concerné.The file name takes the form ApplicationName.mda.config; for example, notepad.exe.mda.config. Assistants that are enabled in the application configuration file may have attributes or elements specifically designed to control that assistant's behavior.

L’exemple suivant montre comment activer et configurer le marshaling:The following example shows how to enable and configure the 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 un type non managé pour chaque transition de code managé vers un code non managé dans l’application.The Marshaling MDA emits information about the managed type that is being marshaled to an unmanaged type for each managed-to-unmanaged transition in the application. L' Marshaling Assistant Débogage managé peut également filtrer les noms des champs de méthode et de structure fournis dans les éléments enfants methodFilter et fieldFilter , respectivement.The Marshaling MDA can also filter the names of the method and structure fields supplied in the methodFilter and fieldFilter child elements, respectively.

L’exemple suivant montre comment activer plusieurs Assistants Débogage managé à l’aide de leurs paramètres par défaut :The following example shows how to enable multiple MDAs by using their default settings:

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

Important

Quand vous spécifiez plusieurs Assistants dans un fichier de configuration, vous devez les répertorier dans l'ordre alphabétique.When you specify more than one assistant in a configuration file, you must list them in alphabetical order. Par exemple, pour activer les Assistants Débogage managé virtualCERCall et invalidCERCall, vous devez ajouter l'entrée <invalidCERCall /> avant l'entrée <virtualCERCall />.For example, if you want to enable both the virtualCERCall and the invalidCERCall MDAs, you must add the <invalidCERCall /> entry before the <virtualCERCall /> entry. Si vous n'indiquez pas les entrées dans l'ordre alphabétique, vous obtenez un message d'exception non gérée liée à un fichier de configuration non valide.If the entries are not in alphabetical order, an unhandled invalid configuration file exception message is displayed.

Exceptions MDAMDA exceptions

Lorsqu’un Assistant Débogage managé est activé, il est actif même lorsque votre code ne s’exécute pas sous un débogueur.When an MDA is enabled, it's active even when your code is not executing under a debugger. Si un événement d'Assistant Débogage managé est déclenché en l'absence de débogueur, le message de l'événement est présenté 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.If an MDA event is raised when a debugger is not present, the event message is presented in an unhandled exception dialog box, although it is not an unhandled exception. Pour éviter l'affichage de la boîte de dialogue, supprimez les paramètres de désactivation de l'Assistant Débogage managé quand votre code ne s'exécute pas dans un environnement de débogage.To avoid the dialog box, remove the MDA-enabling settings when your code is not executing in a debugging environment.

Lorsque votre code s’exécute dans l’environnement de développement intégré (IDE) de Visual Studio, vous pouvez éviter la boîte de dialogue d’exception qui s’affiche pour les événements MDA spécifiques.When your code executes in the Visual Studio integrated development environment (IDE), you can avoid the exception dialog box that appears for specific MDA events. Pour ce faire, dans le menu Déboguer , choisissezparamètres d’exception Windows > .To do that, on the Debug menu, choose Windows > Exception Settings. Dans la fenêtre Paramètres d’exception, développez la liste Assistants Débogage managé , puis désactivez la case à cocher arrêter la levée en cas d' exception pour chaque MDA.In the Exception Settings window, expand the Managed Debugging Assistants list, and then clear the Break When Thrown check box for the individual MDA. Vous pouvez également utiliser cette boîte de dialogue pour activer l’affichage des boîtes de dialogue d’exception d’Assistant Débogage managé.You can also use this dialog box to enable the display of MDA exception dialog boxes.

Sortie de l'Assistant Débogage managéMDA Output

La sortie de l’Assistant Débogage managé est semblable à l’exemple suivant, PInvokeStackImbalance qui montre la sortie de l’Assistant Débogage managé :MDA output is similar to the following example, which shows the output from the PInvokeStackImbalance MDA:

Un appel à la fonction PInvoke’MDATest ! MDATest. Program :: StdCall’a déséquilibré la pile. Cela est probablement dû au fait que la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la Convention d’appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.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 aussiSee also