Partilhar via


PInvokeStackImbalance 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 PInvokeStackImbalance assistente de depuração gerenciado (MDA) é ativado quando o CLR deteta que a profundidade da pilha após uma chamada de invocação de plataforma não corresponde à profundidade de pilha esperada, dada a convenção de chamada especificada no DllImportAttribute atributo e a declaração dos parâmetros na assinatura gerenciada.

O PInvokeStackImbalance MDA é implementado apenas para plataformas x86 de 32 bits.

Nota

O PInvokeStackImbalance MDA está desativado por padrão. No Visual Studio 2017 e versões posteriores, o PInvokeStackImbalance MDA aparece na lista Assistentes de Depuração Gerenciados na caixa de diálogo Configurações de Exceção (que é exibida quando você seleciona Depurar>Configurações de Exceção do Windows).> No entanto, marcar ou desmarcar a caixa de seleção Quebrar quando lançado não habilita ou desabilita o MDA, ele apenas controla se o Visual Studio lança uma exceção quando o MDA é ativado.

Sintomas

Um aplicativo encontra uma violação de acesso ou corrupção de memória ao fazer ou seguir uma chamada de invocação de plataforma.

Motivo

A assinatura gerenciada da chamada de invocação da plataforma pode não corresponder à assinatura não gerenciada do método que está sendo chamado. Essa incompatibilidade pode ser causada pela assinatura gerenciada não declarar o número correto de parâmetros ou não especificar o tamanho apropriado para os parâmetros. O MDA também pode ser ativado porque a convenção de chamada, possivelmente especificada pelo DllImportAttribute atributo, não corresponde à convenção de chamada não gerenciada.

Resolução

Analise a convenção de assinatura e chamada da plataforma gerenciada para confirmar que ela corresponde à assinatura e à convenção de chamada do destino nativo. Tente especificar explicitamente a convenção de chamada nos lados gerenciado e não gerenciado. Também é possível, embora não tão provável, que a função não gerenciada desequilibrou a pilha por algum outro motivo, como um bug no compilador não gerenciado.

Efeito no tempo de execução

Força todas as chamadas de invocação de plataforma a tomar o caminho não otimizado no CLR.

Saída

A mensagem MDA fornece o nome da chamada de método de invocação de plataforma que está causando o desequilíbrio de pilha. Uma mensagem de exemplo de um método SampleMethod de chamada de chamada de plataforma é:

Uma chamada para a função PInvoke 'SampleMethod' desequilibrou a pilha. Isso é provável porque a assinatura PInvoke gerenciada não corresponde à assinatura de destino não gerenciada. Verifique se a convenção de chamada e os parâmetros da assinatura PInvoke correspondem à assinatura não gerenciada de destino.

Configuração

<mdaConfig>
  <assistants>
    <pInvokeStackImbalance />
  </assistants>
</mdaConfig>

Consulte também