Compartilhar via


MDA contextSwitchDeadlock

Observação

Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O MDA (assistente para depuração gerenciada) contextSwitchDeadlock é ativado quando um deadlock é detectado durante uma tentativa de transição de contexto COM.

Sintomas

O sintoma mais comum é que uma chamada em um componente COM não gerenciado de um código gerenciado não retorna. Outro sintoma é que o uso da memória aumenta com o tempo.

Causa

A causa mais provável é que um thread de STA (single-threaded apartment) não está bombeando as mensagens. O thread de STA está esperando sem bombear as mensagens ou está realizando operações longas e não está permitindo o bombeamento da fila de mensagens.

O aumento do uso da memória com o tempo é causado por uma tentativa do thread do finalizador de chamar Release em um componente COM não gerenciado e pela falta de retorno desse componente. Isso impede que o finalizador recupere outros objetos.

Por padrão, STA é o modelo de threading para o thread principal dos aplicativos do console do Visual Basic. Esse MDA é ativado se um thread de STA usar a interoperabilidade de COM direta ou indiretamente por meio do Common Language Runtime ou de um controle de terceiros. Para evitar a ativação desse MDA em um aplicativo do console do Visual Basic, aplique o atributo MTAThreadAttribute ao método principal ou modifique o aplicativo para bombear as mensagens.

É possível que esse MDA seja ativado erroneamente quando todas as condições a seguir forem atendidas:

  • Um aplicativo cria componentes COM de threads de STA direta ou indiretamente por meio das bibliotecas.

  • O aplicativo foi interrompido no depurador e o usuário continuou o aplicativo ou realizou uma operação de etapa.

  • A depuração não gerenciada não está habilitada.

Para determinar se o MDA está sendo ativado erroneamente, desabilite todos os pontos de interrupção, reinicie o aplicativo e permita que ele seja executado sem parar. Se o MDA não for ativado, é provável que a ativação inicial era falsa. Nesse caso, desabilite o MDA para evitar interferências na sessão de depuração.

Observação

Esse MDA está no conjunto padrão para o Visual Studio. Para obter informações sobre como desabilitar MDAs, confira Diagnosticar erros com assistentes de depuração gerenciada.

Resolução

Siga as regras de COM em relação ao bombeamento das mensagens de STA.

Efeito sobre o runtime

Esse MDA não tem efeito sobre o CLR. Ele apenas relata dados sobre contextos de COM.

Saída

Uma mensagem descrevendo o contexto atual e o contexto de destino.

Configuração

<mdaConfig>
  <assistants>
    <contextSwitchDeadlock />
  </assistants>
</mdaConfig>

Confira também