Condividi tramite


MDA pInvokeStackImbalance

Aggiornamento: novembre 2007

L'assistente al debug gestito (MDA, Managed Debugging Assistant) pInvokeStackImbalance viene attivato quando CLR rileva che la profondità dello stack dopo una chiamata pInvoke non corrisponde a quella prevista indicata nella convenzione di chiamata specificata nell'attributo DllImportAttribute, nonché nella dichiarazione dei parametri nella firma gestita.

Nota:

L'MDA pInvokeStackImbalance viene implementato solo per le piattaforme x86 a 32 bit.

Nota:

In .NET Framework versione 3.5 l'MDA pInvokeStackImbalance è disattivato per impostazione predefinita. Quando si utilizza .NET Framework versione 3.5 con Visual Studio 2005, l'MDA pInvokeStackImbalance viene visualizzato nell'elenco Assistenti al debug gestito della finestra di dialogo Eccezioni, visualizzata quando si sceglie Eccezioni dal menu Debug. Se tuttavia si seleziona o deseleziona la casella di controllo Generata per pInvokeStackImbalance, l'MDA non viene attivato o disattivato. Viene controllato solo se Visual Studio genera un'eccezione quando viene attivato l'MDA.

Sintomi

In un'applicazione viene rilevata una violazione di accesso o un danneggiamento della memoria quando si effettua una chiamata di P/Invoke o si sposta una chiamata dopo quella di P/Invoke.

Causa

La firma gestita della chiamata di P/invoke potrebbe non corrispondere alla firma non gestita del metodo chiamato. La mancata corrispondenza può essere causata dal fatto che la firma gestita non dichiari il numero corretto di parametri o non specifichi le dimensioni appropriate per i parametri. È anche possibile che l'assistente al debug gestito venga attivato perché la convenzione di chiamata, specificata dall'attributo DllImportAttribute, non corrisponde alla convenzione di chiamata non gestita.

Risoluzione

Verificare la convenzione di chiamata e la firma gestita della chiamata di P/Invoke per confermare che corrispondano rispettivamente alla convenzione di chiamata e alla firma della destinazione nativa. Tentare di specificare in modo esplicito la convenzione di chiamata sia nel codice gestito che in quello non gestito. È anche possibile, sebbene improbabile, che la funzione non gestita abbia sbilanciato lo stack per altri motivi, ad esempio per un bug nel compilatore non gestito.

Effetto sul runtime

A tutte le chiamate di P/Invoke viene imposto di seguire il percorso non ottimizzato in CLR.

Output

Nel messaggio dell'assistente al debug gestito viene specificato il nome della chiamata al metodo P/Invoke che causa lo sbilanciamento dello stack. Di seguito viene riportato un messaggio di esempio di una chiamata di P/Invoke sul metodo 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.

Configurazione

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

Vedere anche

Concetti

Diagnostica degli errori tramite gli assistenti al debug gestito

Cenni preliminari sul marshalling di interoperabilità

Riferimenti

MarshalAsAttribute

Altre risorse

Interoperabilità