Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Note
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 gerida (MDA) é ativado quando o CLR deteta que a profundidade da pilha após uma chamada de invocação da plataforma não corresponde à profundidade esperada, dada a convenção de chamada especificada no DllImportAttribute atributo e a declaração dos parâmetros na assinatura gerida.
A PInvokeStackImbalance MDA é implementada apenas para plataformas x86 de 32 bits.
Note
O PInvokeStackImbalance MDA está desativado por defeito. No Visual Studio 2017 e versões posteriores, o PInvokeStackImbalance MDA aparece na lista de Assistentes de Depuração Geridos, na caixa de diálogoDefinições de Exceção (que é mostrada quando seleciona DebugWindowsExceptionSettings>>). No entanto, selecionar ou desligar a caixa de seleção Break When Thrown não ativa nem desativa a MDA; só controla se o Visual Studio lança uma exceção quando o MDA está ativado.
Sintomas
Uma aplicação encontra uma violação de acesso ou corrupção de memória ao fazer ou seguir uma chamada de invoke na plataforma.
Motivo
A assinatura gerida da chamada de invocação da plataforma pode não coincidir com a assinatura não gerida do método a ser chamado. Esta incompatibilidade pode ser causada pela assinatura gerida não declarar o número correto de parâmetros ou não especificar o tamanho apropriado para esses parâmetros. A MDA também pode ativar-se porque a convenção de chamada, possivelmente especificada pelo DllImportAttribute atributo, não corresponde à convenção de chamada não gerida.
Resolução
Revise a convenção de assinatura e chamada da plataforma gerida para confirmar que corresponde à convenção de assinatura e chamada do destino nativo. Tente especificar explicitamente a convenção de chamada tanto do lado gerido como do lado não gerido. Também é possível, embora menos provável, que a função não gerida tenha desequilibrado a pilha por alguma outra razão, como um bug no compilador não gerido.
Efeito no tempo de execução
Obriga todas as chamadas de invocação da plataforma a seguir o caminho não otimizado no CLR.
Output
A mensagem MDA dá o nome da chamada de método invoke da plataforma que está a causar o desequilíbrio da pilha. Uma mensagem de exemplo de um método SampleMethod de chamada de invocação de plataforma é:
Uma chamada à função 'SampleMethod' do PInvoke 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>