Partager via


Assistant Débogage managé pInvokeStackImbalance

L'Assistant Débogage managé (MDA, Managed Debugging Assistant) pInvokeStackImbalance est activé lorsque le CLR détecte que la profondeur de la pile après un appel de code non managé ne correspond pas à la profondeur de la pile attendue étant donné la convention d'appel spécifiée dans l'attribut DllImportAttribute ainsi que la déclaration des paramètres dans la signature managée.

RemarqueRemarque

Le MDA pInvokeStackImbalance est implémenté uniquement pour les plateformes 32 bits x86.

RemarqueRemarque

Dans le .NET Framework version 3.5, le MDA pInvokeStackImbalance est désactivé par défaut.Lorsque vous utilisez le .NET Framework version 3.5 avec Visual Studio 2005, le MDA pInvokeStackImbalance apparaît dans la liste Assistant Débogage managé de la boîte de dialogue Exceptions (qui s'affiche lorsque vous cliquez sur Exceptions dans le menu Déboguer).Toutefois, la sélection ou la désactivation de la case à cocher Levé pour pInvokeStackImbalance n'active ou ne désactive pas le MDA ; elle indique seulement si Visual Studio lève une exception lorsque 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. Le MDA peut également être activé car la convention d'appel, éventuellement spécifiée par l'attribut DllImportAttribute, ne correspond pas à la convention d'appel non managée.

Solution

Passez en revue la signature managée de l'appel de code non managé et la convention d'appel managée pour confirmer qu'elles correspondent à la signature et à la convention d'appel de la cible native. Essayez de spécifier explicitement la convention d'appel du côté managé et 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 du 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 :

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.

Configuration

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

Voir aussi

Référence

MarshalAsAttribute

Concepts

Diagnostic d'erreurs avec les Assistants de débogage managés

Marshaling d'interopérabilité

Autres ressources

Interopérabilité