Partilhar via


contextSwitchDeadlock MDA

Nota

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

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

Sintomas

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

Motivo

A causa mais provável é que um thread de apartamento de thread único (STA) não está bombeando mensagens. O thread STA está aguardando sem bombear mensagens ou está executando operações demoradas 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 tentando 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 para o thread principal de aplicativos de console do Visual Basic é STA. Esse MDA é ativado se um thread STA usa 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 do Visual Basic, aplique o MTAThreadAttribute atributo ao método principal ou modifique o aplicativo para bombear mensagens.

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

  • Um aplicativo cria componentes COM a partir 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, desative 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 tenha sido falsa. Nesse caso, desative o MDA para evitar interferência com a sessão de depuração.

Nota

Este MDA está no conjunto padrão para Visual Studio. Para obter informações sobre como desabilitar MDAs, consulte Diagnosticando erros com assistentes de depuração gerenciados.

Resolução

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

Efeito no tempo de execução

Este MDA não tem efeito sobre o CLR. Apenas reporta 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