Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article est spécifique à .NET Framework. Ceci ne s’applique pas aux implémentations plus récentes de .NET, y compris .NET 6 et versions ultérieures.
L’Assistant PInvokeStackImbalance débogage managé (MDA) est activé lorsque le CLR détecte que la profondeur de la pile après un appel d’appel de plateforme ne correspond pas à la profondeur de pile attendue, étant donné la convention d’appel spécifiée dans l’attribut DllImportAttribute et la déclaration des paramètres dans la signature managée.
Le PInvokeStackImbalance MDA est implémenté uniquement pour les plateformes x86 32 bits.
Note
Le PInvokeStackImbalance MDA est désactivé par défaut. Dans Visual Studio 2017 et versions ultérieures, le PInvokeStackImbalance MDA apparaît dans la liste Assistants de débogage managé dans la boîte de dialogue Paramètres d’exception (qui s’affiche lorsque vous sélectionnez Déboguer>Windows>Exception Settings). Toutefois, l’activation ou l’effacement de la case à cocher Saut lors de la levée n’active pas ou ne désactive pas l’authentification multifacteur ; elle contrôle uniquement si Visual Studio lève une exception lorsque le MDA est activé.
Symptoms
Une application rencontre une violation d’accès ou une altération de la mémoire lors de l’établissement ou de la suite d’un appel d’appel de plateforme.
Cause
La signature managée de l’appel d’appel de plateforme peut ne pas correspondre à la signature non managée de la méthode appelée. Cette incompatibilité peut être due à la signature managée qui ne déclare pas le nombre correct de paramètres ou ne spécifie pas la taille appropriée pour les paramètres. Le MDA peut également s’activer, car la convention d’appel, éventuellement spécifiée par l’attribut DllImportAttribute , ne correspond pas à la convention d’appel non managée.
Résolution
Passez en revue la signature d’appel de plateforme managée et la convention d’appel pour confirmer qu’elle correspond à la convention de signature et d’appel de la cible native. Essayez de spécifier explicitement la convention d’appel sur les côtés gérés et non managés. Il est également possible, bien que pas aussi probable, que la fonction non managée déséquilibré la pile pour une autre raison, telle qu’un bogue dans le compilateur non managé.
Effet sur le runtime
Force tous les appels d’appel de plateforme à prendre le chemin non optimisé dans le CLR.
Sortie
Le message MDA donne le nom de l’appel de méthode d’appel de plateforme qui provoque le déséquilibre de la pile. Un exemple de message d’appel de plateforme sur la méthode SampleMethod est :
Un appel à la fonction PInvoke « SampleMethod » a déséquilibré la pile. Cela 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>