PInvokeStackImbalance (MDA)
Remarque
Cet article est spécifique au .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.
L’Assistant Débogage managé (MDA) PInvokeStackImbalance
est activé quand le CLR détecte que la profondeur de la pile après un appel de code non managé ne correspond pas à la profondeur attendue de la pile selon la convention d’appel spécifiée dans l’attribut DllImportAttribute et la déclaration des paramètres dans la signature managée.
L'Assistant Débogage managé (MDA) PInvokeStackImbalance
est implémenté uniquement pour les plateformes 32 bits x86.
Notes
Le MDA PInvokeStackImbalance
est désactivé par défaut. Dans Visual Studio 2017 et ultérieur, le MDA PInvokeStackImbalance
apparaît dans la liste Assistants Débogage managé dans la boîte de dialogue Paramètres d’exception (qui s’affiche quand vous sélectionnez Déboguer>Windows>Paramètres d’exception). Cependant, le fait de cocher ou décocher la case Arrêter en cas d’exception levée ne permet pas d’activer ou de désactiver l’Assistant Débogage managé (MDA) ; cela détermine seulement si Visual Studio lève une exception quand le MDA est activé.
Symptômes
Une application rencontre une violation d'accès ou une altération de la mémoire pendant ou après un appel de code non managé.
Cause
Il se peut que la signature managée de l'appel de code non managé ne corresponde pas à la signature non managée de la méthode qui est appelée. Cette incompatibilité peut être due au fait que la signature managée ne déclare pas le nombre correct de paramètres ou ne spécifie pas la taille appropriée pour les paramètres. L’Assistant Débogage managé (MDA) peut également être activé parce que la convention d’appel, éventuellement spécifiée par l’attribut DllImportAttribute, ne correspond pas à la convention d’appel non managée.
Résolution
Vérifiez que la signature managée de l'appel de code non managé et la convention d'appel correspondent à la signature et à la convention d'appel de la cible native. Essayez de spécifier explicitement la convention d’appel à la fois du côté managé et du côté non managé. Il est également possible, mais moins probable, que la fonction non managée ait déséquilibré la pile pour une raison quelconque, telle qu'un bogue dans le compilateur non managé.
Effet sur le runtime
Oblige tous les appels de code non managé à prendre le chemin d’accès non optimisé dans le CLR.
Sortie
Le message de l'Assistant Débogage managé (MDA) donne le nom de l'appel de méthode d'appel de code non managé qui provoque le déséquilibre de la pile. Voici un exemple de message d'un appel de code non managé sur la méthode SampleMethod
:
Un appel à la fonction PInvoke « SampleMethod » a déséquilibré la pile. Ceci est probablement dû au fait que la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d’appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.
Configuration
<mdaConfig>
<assistants>
<pInvokeStackImbalance />
</assistants>
</mdaConfig>