Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 PInvokeStackImbalance MDA (assistente de depuração gerenciada) é ativado quando o CLR detecta que a profundidade da pilha após uma chamada de invocação de plataforma não corresponde à profundidade de pilha esperada, considerando 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.
Note
O PInvokeStackImbalance MDA está desabilitado por padrão. No Visual Studio 2017 e versões posteriores, o PInvokeStackImbalance MDA aparece na lista Assistentes de Depuração Gerenciada na caixa de diálogo Configurações de Exceção (que é exibida quando você seleciona Configurações de Depuração>Windows>Exception). No entanto, selecionar ou desmarcar a caixa de seleção Interromper Quando Lançada não habilita ou desabilitar o MDA; ele controla apenas se Visual Studio gera uma exceção quando o MDA é ativado.
Symptoms
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.
Cause
A assinatura gerenciada da chamada de invocação de 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
Examine a convenção de chamada e assinatura de invocação da plataforma gerenciada para confirmar se ela corresponde à convenção de assinatura e chamada do destino nativo. Tente especificar explicitamente a convenção de chamada nos lados gerenciados e não gerenciados. Também é possível, embora não seja tão provável, que a função não gerenciada desbalanceou a pilha por algum outro motivo, como um bug no compilador não gerenciado.
Efeito no Runtime
Força todas as chamadas de invocação de plataforma a tomar o caminho não otimizado no CLR.
Saída
A mensagem do MDA fornece o nome da chamada de método de invocação de plataforma que está causando o desequilíbrio da pilha. Uma mensagem de exemplo de uma chamada de invocação de plataforma no método SampleMethod é:
Uma chamada para a função PInvoke 'SampleMethod' desequilibrou a pilha. Isso provavelmente ocorre 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>