Condividi tramite


PInvokeStackImbalance (MDA)

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à prevista dello stack, 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 PInvokeStackImbalance al 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 nella finestra di dialogo Impostazioni eccezioni , visualizzata quando si seleziona Debug>impostazioni eccezionidi 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. 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.

Configurazione

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

Vedi anche