PInvokeStackImbalance (MDA)
Nota
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .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 al debug gestito PInvokeStackImbalance
viene implementato solo per piattaforme x86 a 32 bit.
Nota
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>impostazioni eccezioni di Windows.> 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 l'assistente al debug gestito viene attivato.
Sintomi
Un'applicazione rileva una violazione di accesso o un danneggiamento della memoria durante o dopo una chiamata PInvoke.
Causa
La firma gestita della chiamata PInvoke 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 specificata dall'attributo DllImportAttribute non corrisponde alla convenzione di chiamata non gestita.
Risoluzione
Rivedere la firma PInvoke gestita e la convenzione di chiamata per verificare la corrispondenza con la firma e la convenzione di chiamata della destinazione nativa. Provare a specificare in modo esplicito la convenzione di chiamata su entrambi i lati, gestito e non gestito. È anche possibile, anche se improbabile, che la funzione non gestita abbia sbilanciato lo stack per altri motivi, ad esempio un bug nel compilatore non gestito.
Effetto sull'ambiente di esecuzione
Forza l'uso del percorso non ottimizzato in CLR per tutte le chiamate PInvoke.
Output
Il messaggio dell'assistente al debug gestito fornisce il nome della chiamata al metodo PInvoke che sta causando lo sbilanciamento dello stack. Un messaggio di esempio di una chiamata PInvoke al metodo SampleMethod
è:
Una chiamata alla funzione PInvoke 'SampleMethod' ha sbilanciato lo stack. La causa probabile è che 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.
Impostazione
<mdaConfig>
<assistants>
<pInvokeStackImbalance />
</assistants>
</mdaConfig>