PInvokeStackImbalance MDA

Note

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.

L'assistente PInvokeStackImbalance al debug gestito viene attivato quando CLR rileva che la profondità dello stack dopo una chiamata platform invoke non corrisponde alla profondità dello stack prevista, data la convenzione di chiamata specificata nell'attributo DllImportAttribute e la dichiarazione dei parametri nella firma gestita.

L'assistente PInvokeStackImbalance al debug gestito viene implementato solo per piattaforme x86 a 32 bit.

Note

L'assistente al PInvokeStackImbalance debug gestito è disabilitato per impostazione predefinita. In Visual Studio 2017 e versioni successive, l'assistente PInvokeStackImbalance al debug gestito viene visualizzato nell'elenco Assistente debug gestito della finestra di dialogo Impostazioni eccezioni , visualizzata quando si seleziona Debug>Windows>Impostazioni eccezione. Tuttavia, la selezione o la cancellazione della casella di controllo Interrompi quando generata non abilita o disabilita l'assistente al debug gestito; controlla solo se Visual Studio genera un'eccezione quando viene attivato l'assistente al debug gestito.

Symptoms

Un'applicazione rileva una violazione di accesso o un danneggiamento della memoria durante l'esecuzione o l'esecuzione di una chiamata platform invoke.

Cause

La firma gestita della chiamata platform invoke potrebbe non corrispondere alla firma non gestita del metodo chiamato. Questa mancata corrispondenza può essere causata dalla firma gestita che non dichiara il numero corretto di parametri o non specifica le dimensioni appropriate per i parametri. L'assistente al debug gestito può essere attivato anche perché la convenzione di chiamata, eventualmente specificata dall'attributo DllImportAttribute , non corrisponde alla convenzione di chiamata non gestita.

Risoluzione

Esaminare la convenzione di chiamata e la firma della piattaforma gestita per verificare che corrisponda alla firma e alla convenzione di chiamata della destinazione nativa. Provare a specificare in modo esplicito la convenzione di chiamata sui lati gestiti e non gestiti. È anche possibile, anche se non altrettanto probabile, che la funzione non gestita sbilancia lo stack per qualche altro motivo, ad esempio un bug nel compilatore non gestito.

Effetto sul runtime

Impone a tutte le chiamate di platform invoke di accettare il percorso non ottimizzato in CLR.

Risultato

Il messaggio MDA indica il nome della chiamata al metodo platform invoke che causa lo squilibrio dello stack. Un messaggio di esempio di una chiamata platform invoke al metodo SampleMethod è:

Una chiamata alla funzione PInvoke 'SampleMethod' ha sbilanciato lo stack. Ciò è probabile perché la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma non gestita di destinazione.

Configuration

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

Vedere anche