MDA PInvokeStackImbalance
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 Assistente de Depuração Gerenciado (MDA) PInvokeStackImbalance
é ativado quando o CLR detecta que a profundidade da pilha após uma chamada de invocação de plataforma não corresponde à profundidade da pilha esperada, dada a convenção de chamada especificada no atributo DllImportAttribute, bem como a declaração dos parâmetros na assinatura gerenciada.
O MDA PInvokeStackImbalance
é implementado somente para plataformas x86 de 32 bits.
Observação
O MDA PInvokeStackImbalance
está desabilitado por padrão. No Visual Studio 2017 e versões posteriores, o MDA PInvokeStackImbalance
aparece na lista Assistentes de Depuração Gerenciada 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 Interromper quando Geradas não habilita nem desabilita o MDA, apenas controla se o Visual Studio gera ou não uma exceção quando o MDA é ativado.
Sintomas
Um aplicativo encontra uma violação de acesso ou uma corrupção de memória ao fazer uma chamada de invocação de plataforma ou em seguida a ela.
Causa
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 devido à assinatura gerenciada não declarar o número correto de parâmetros ou não especificar o tamanho apropriado para eles. O MDA também pode ser ativado porque a convenção de chamada, possivelmente especificada pelo atributo DllImportAttribute, não corresponde à convenção de chamada não gerenciada.
Resolução
Examine a assinatura de invocação e convenção de 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 tanto no lado gerenciado quanto no não gerenciado. Também é possível, embora mais improvável, que a função não gerenciada tenha desequilibrado a pilha por algum outro motivo, assim como um bug no compilador não gerenciado.
Efeito sobre o runtime
Força todas as chamadas de invocação de plataforma a usar 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 na 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 é 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>