Compartilhar via


contextSwitchDeadlock MDA

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

Sintomas

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

Causa

A causa mais provável é que um thread de single-threaded apartment (STA) não é bombeamento de mensagens. O thread STA é uma espera sem bombeamento das mensagens ou está executando operações demoradas e não está permitindo que a fila de mensagens de bomba.

Aumentando o tempo de uso de memória é causado pelo thread finalizador tentando chamar Release em um não gerenciado COM o componente e que não está retornando. Isso impede que o finalizador recuperar outros objetos.

Por padrão, o modelo de threading do thread principal de Visual Basic aplicativos de console é STA. Este MDA será ativado se um segmento STA usa interoperabilidade COM direta ou indiretamente por meio do common language runtime ou um controle de terceiros. Para evitar este MDA em um aplicativo de console de Visual Basic de ativação, aplicar o MTAThreadAttribute de atributo para o método principal ou modificar o aplicativo para mensagens de bomba.

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

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

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

  • Depuração não gerenciada não está habilitado.

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

Observação

Este MDA é no padrão definido para Visual Studio 2005 e versões posteriores.Quando o processo de hospedagem está habilitado no Visual Studio, não é possível desativar MDAs, que estão no conjunto padrão.O processo de hospedagem é ativado por padrão, portanto, deve ser explicitamente desativada.Para obter informações sobre como desabilitar os MDAs, consulte "Ativando e desativando MDAs" in Diagnosticar erros com assistentes de depuração gerenciada.

Resolução

Siga as regras de COM respeito bombeamento de mensagens STA.

Efeito sobre o tempo de execução.

Este MDA não tem efeito sobre o CLR. Ela somente reporta dados sobre os contextos de COM.

Saída

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

Configuração

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

Consulte também

Referência

MarshalAsAttribute

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada

Interop Marshaling

Outros recursos

Interoperabilidade