Partager via


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>

Voir aussi