Partager via


Assistant Débogage managé contextSwitchDeadlock

L'Assistant Débogage managé (MDA, Managed Debugging Assistant) contextSwitchDeadlock est activé lorsqu'un interblocage est détecté au cours d'une tentative de transition de contexte COM.

Symptômes

Le symptôme le plus courant est qu'un appel sur un composant COM non managé à partir du code managé ne soit pas retourné. Un autre symptôme est l'augmentation de l'utilisation de la mémoire avec le temps.

Cause

La cause la plus probable est qu'un thread cloisonné (STA, Single-Threaded Apartment) ne pompe pas de messages. Le thread cloisonné (STA, Single-Threaded Apartment) attend sans pomper de messages ou exécute de longues opérations et n'autorise pas la file d'attente de messages à pomper.

L'augmentation de l'utilisation de la mémoire avec le temps est due à la tentative du thread finaliseur d'appeler Release sur un composant COM non managé et au fait que ce composant ne soit pas retourné. Cela empêche le finaliseur de récupérer d'autres objets.

Par défaut, le modèle de thread pour le thread principal d'applications console Visual Basic est le thread cloisonné (STA, Single-Threaded Apartment). Ce MDA est activé si un thread STA utilise l'interopérabilité COM soit directement soit indirectement par le biais du Common Language Runtime ou d'un contrôle tiers. Pour éviter d'activer ce MDA dans une application console Visual Basic, appliquez l'attribut MTAThreadAttribute à la méthode principale ou modifiez l'application pour qu'elle pompe les messages.

Il est possible que ce MDA soit faussement activé lorsque toutes les conditions suivantes sont réunies :

  • Une application crée des composants COM à partir de threads STA soit directement soit indirectement par le biais des bibliothèques.

  • L'application a été arrêtée dans le débogueur et l'utilisateur a continué l'application ou a exécuté une opération pas à pas.

  • Le débogage non managé n'est pas activé.

Pour déterminer si le MDA est faussement activé, désactivez tous les points d'arrêt, redémarrez l'application et laissez-la s'exécuter sans l'interrompre. Si le MDA n'est pas activé, il est probable que l'activation initiale était fausse. Dans ce cas, désactivez le MDA pour éviter les interférences avec la session de débogage.

RemarqueRemarque

Ce MDA se trouve dans l'ensemble par défaut de Visual Studio 2005 et versions ultérieures.Lorsque le processus d'hébergement est activé dans Visual Studio, vous ne pouvez pas désactiver les MDA qui se trouvent dans l'ensemble par défaut.Le processus d'hébergement étant activé par défaut, il doit être désactivé explicitement.Pour plus d'informations sur la désactivation des MDA, consultez « Activation et désactivation de MDA » dans Diagnostic d'erreurs avec les Assistants de débogage managés.

Solution

Suivez les règles COM concernant le pompage de messages STA.

Effet sur le runtime

Ce MDA n'a aucun effet sur le CLR. Il signale uniquement des données relatives aux contextes COM.

Sortie

Message décrivant le contexte courant et le contexte cible.

Configuration

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock enable="false" />
  </assistants>
</mdaConfig>

Voir aussi

Référence

MarshalAsAttribute

Concepts

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

Marshaling d'interopérabilité

Autres ressources

Interopérabilité