contextSwitchDeadlock MDA

Note

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

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

Symptoms

O sintoma mais comum é que uma chamada em um componente COM não gerenciado do código gerenciado não retorna. Outro sintoma é o aumento do uso de memória ao longo do tempo.

Cause

A causa mais provável é que um thread sta (apartamento com thread único) não está bombeando mensagens. O thread sta está aguardando sem bombear mensagens ou está executando operações longas e não está permitindo que a fila de mensagens bombeie.

O aumento do uso de memória ao longo do tempo é causado pelo thread do finalizador que tenta chamar Release um componente COM não gerenciado e esse componente não está retornando. Isso impede que o finalizador recupere outros objetos.

Por padrão, o modelo de threading do thread principal de aplicativos de console Visual Basic é STA. Esse MDA será ativado se um thread STA usar a interoperabilidade COM direta ou indiretamente por meio do common language runtime ou de um controle de terceiros. Para evitar ativar esse MDA em um aplicativo de console Visual Basic, aplique o MTAThreadAttribute atributo ao método principal ou modifique o aplicativo para bombear mensagens.

É possível que esse MDA seja ativado falsamente quando todas as seguintes condições forem atendidas:

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

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

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

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

Note

Esse MDA está no conjunto padrão para Visual Studio. Para obter informações sobre como desabilitar MDAs, consulte Diagnosticing Errors with Managed Debugging Assistants.

Resolução

Siga as regras com relação ao bombeamento de mensagens STA.

Efeito no Runtime

Esse MDA não tem nenhum efeito sobre o CLR. Ele só relata dados sobre contextos COM.

Saída

Uma mensagem que descreve o contexto atual e o contexto de destino.

Configuração

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

Consulte também