MDA de contextSwitchDeadlock
Nota:
Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.
El asistente para la depuración administrada (MDA, por sus siglas en inglés) contextSwitchDeadlock
se activa cuando se detecta un interbloqueo durante un intento de transición de contexto COM.
Síntomas
El síntoma más común es que no se devuelve una llamada en un componente COM sin administrar de código administrado. Otro síntoma es el aumento de uso de memoria con el tiempo.
Causa
La causa más probable es que haya un subproceso de contenedor uniproceso (STA, por sus siglas en inglés) que no esté suministrando mensajes. El subproceso de STA está en espera sin suministrar mensajes o está realizando operaciones extensas y no permite que la cola de mensajes se suministre.
El incremento en el uso de memoria con el tiempo está causado por el subproceso de finalizador que intenta llamar a Release
en un componente COM sin administrar y que ese componente no devuelve. Esto impide que el finalizador pueda recuperar otros objetos.
De forma predeterminada, STA es el modelo de subprocesos del subproceso principal de aplicaciones de consola de Visual Basic. Este MDA se activa si un subproceso de STA usa la interoperabilidad de COM directa o indirectamente mediante Common Language Runtime o un control de terceros. Para evitar la activación de este MDA en una aplicación de consola de Visual Basic, aplique el atributo MTAThreadAttribute al método principal o modifique la aplicación para que suministre mensajes.
Es posible que el MDA se active equivocadamente si se cumplen todas las condiciones siguientes:
Una aplicación crea componentes COM a partir de subprocesos de STA directa o indirectamente a través de bibliotecas.
La aplicación se detuvo en el depurador y el usuario continuó con la aplicación o realizó una operación de paso.
La depuración sin administrar no está habilitada.
Para determinar si el MDA se activa equivocadamente, deshabilite todos los puntos de interrupción, reinicie la aplicación y deje que se ejecute sin detenerla. Si el MDA no se activa, es probable que la activación inicial fuese falsa. En este caso, deshabilite el MDA para evitar interferencias con la sesión de depuración.
Nota
Este MDA es el conjunto predeterminado para Visual Studio. Para obtener más información sobre cómo deshabilitar MDA, vea Diagnóstico de errores con asistentes de depuración administrada.
Solución
Siga las reglas COM respecto al suministro de mensajes de STA.
Efecto en el Runtime
Este MDA no tiene ningún efecto en el CLR. Solo recoge datos sobre contextos COM.
Output
Mensaje que describe el contexto actual y el de destino.
Configuración
<mdaConfig>
<assistants>
<contextSwitchDeadlock />
</assistants>
</mdaConfig>