Compartilhar via


pInvokeStackImbalance MDA

O pInvokeStackImbalance Assistente de depuração gerenciada (MDA) é ativado quando o CLR detecta que a profundidade da pilha após a chamada de invocação de uma plataforma não corresponde a profundidade da pilha esperados, dada a convenção de chamada especificada na DllImportAttribute atributo, bem como a declaração dos parâmetros na assinatura gerenciada.

Observação

O pInvokeStackImbalance MDA é implementado apenas para plataformas 86 x de 32 bits.

Observação

No.NET Framework versão 3.5, o pInvokeStackImbalance MDA é desativado por padrão.Quando você usa o.NET Framework versão 3.5 com Visual Studio de 2005, o pInvokeStackImbalance MDA aparecerão na Managed Debugging Assistants Listar no exceções caixa de diálogo (que é exibido quando você clica em exceções na Debug menu).No entanto, marcando ou desmarcando a Thrown caixa de seleção de pInvokeStackImbalance não habilitar ou desabilitar o MDA; Ele só controla se o Visual Studio lança uma exceção quando o MDA é ativado.

Sintomas

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

Causa

Chamada de invocação de assinatura gerenciada da plataforma podem não coincidir com a assinatura não gerenciada do método sendo chamado. Essa incompatibilidade pode ser causada por 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 ativar porque a convenção de chamada, possivelmente especificado pelo DllImportAttribute de atributo, não coincide com a convenção de chamada não gerenciado.

Resolução

Revisão da plataforma gerenciada invocar a assinatura e a convenção de chamada para confirmar que ela corresponde a assinatura e a convenção de chamada do destino nativo. Tente especificar explicitamente a convenção de chamada em ambos os lados gerenciados e não gerenciados. Também é possível, embora não tão provável que a função não gerenciada unbalanced pilha por outro motivo, como, por exemplo, um bug no compilador não gerenciado.

Efeito sobre o tempo de execução.

Força todas as chamadas da plataforma invoke para percorrer o caminho de não-Optimizado no CLR.

Saída

A mensagem MDA dá o nome da plataforma invocar a chamada de método que está causando o desequilíbrio da pilha. Chamada de método de invocação de uma mensagem de exemplo de uma plataforma SampleMethod é:

A call to PInvoke function 'SampleMethod' has unbalanced the stack. 
This is likely because the managed PInvoke signature does not match 
the unmanaged target signature. Check that the calling convention and 
parameters of the PInvoke signature match the target unmanaged signature.

Configuração

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

Consulte também

Referência

MarshalAsAttribute

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada

Interop Marshaling

Outros recursos

Interoperabilidade