Compartilhar via


MDA gcManagedToUnmanaged

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) gcManagedToUnmanaged causa uma coleta de lixo sempre que um thread faz a transição de código gerenciado para código não gerenciado.

Sintomas

Um componente de usuário não gerenciado gera uma violação de acesso ao tentar usar um objeto gerenciado que tinha sido exposto a COM. O objeto COM parece ter sido liberado. A violação de acesso é não determinística.

Causa

Se um componente não gerenciado não estiver fazendo uma contagem de referência de um objeto COM gerenciado corretamente, o runtime poderá coletar um objeto gerenciado exposto ao COM quando o componente não gerenciado ainda contiver uma referência ao objeto. O runtime chama Release durante as coletas de lixo e, portanto, se o componente de usuário usar o objeto antes que a coleta de lixo ocorra, ele ainda não terá sido coletado. Essa é a origem do não determinismo.

Resolução

A habilitação deste assistente reduz o tempo entre o período em que o objeto é qualificado para a coleta e Release é chamado, ajudando a rastrear qual componente não gerenciado tenta acessar o objeto coletado primeiro.

Efeito sobre o runtime

Causa uma coleta de lixo sempre que um thread faz a transição de código gerenciado para código não gerenciado.

Saída

Esse MDA não produz nenhuma saída.

Configuração

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

Confira também