Share via


pInvokeStackImbalance-MDA

Aktualisiert: November 2007

Der pInvokeStackImbalance-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn die CLR erkennt, dass die Stapeltiefe nach einem Plattformaufruf nicht mit der Stapeltiefe übereinstimmt, die in Anbetracht der im DllImportAttribute-Attribut angegebenen Aufrufkonvention und der Parameter in der verwalteten Signatur zu erwarten war.

Hinweis:

Der pInvokeStackImbalance-MDA wird nur für 32-Bit-x86-Plattformen implementiert.

Hinweis:

In .NET Framework, Version 3.5, wird der pInvokeStackImbalance-MDA standardmäßig deaktiviert. Wenn Sie .NET Framework, Version 3.5, mit Visual Studio 2005 verwenden, wird der pInvokeStackImbalance-MDA in der Assistenten für verwaltetes Debuggen-Liste im Dialogfeld Ausnahmen angezeigt. (Das Dialogfeld wird aufgerufen, wenn Sie im Menü Debuggen auf Ausnahmen klicken.) Wenn Sie jedoch das Kontrollkästchen Ausgelöst für pInvokeStackImbalance auswählen oder dessen Auswahl aufheben, wird der MDA nicht aktiviert oder deaktiviert; hierdurch wird nur festgelegt, ob Visual Studio eine Ausnahme auslöst, wenn der MDA aktiviert ist.

Symptome

Während eines Plattformaufrufs in einer Anwendung oder danach kommt es zu einer Zugriffsverletzung oder einem Speicherschaden.

Ursache

Die verwaltete Signatur des Plattformaufrufs stimmt möglicherweise nicht mit der nicht verwalteten Signatur der aufgerufenen Methode überein. Dazu kann es kommen, wenn für die verwaltete Methode nicht die korrekte Anzahl der Parameter bzw. eine falsche Parametergröße deklariert wurde. Der MDA wird auch aktiviert, wenn die ggf. durch das DllImportAttribute-Attribut festgelegte Aufrufkonvention nicht mit der nicht verwalteten Aufrufkonvention übereinstimmt.

Lösung

Überprüfen Sie die Signatur des verwalteten Plattformaufrufs sowie die Aufrufkonvention, um sich zu vergewissern, dass diese mit der Signatur und Aufrufkonvention des systemeigenen Ziels übereinstimmen. Versuchen Sie, die Aufrufkonvention sowohl auf der verwalteten als auch auf der nicht verwalteten Seite explizit anzugeben. Es ist ebenfalls möglich (wenn auch weniger wahrscheinlich), dass die nicht verwaltete Funktion aus einem anderen Grund einen nicht ausgeglichenen Stapel verursacht hat, beispielsweise durch einen Programmfehler im verwalteten Compiler.

Auswirkungen auf die Laufzeit

Erzwingt für alle Plattformaufrufe die Verwendung des nicht optimierten Pfads in die CLR.

Ausgabe

Die MDA-Meldung enthält den Namen der Plattformaufrufmethode, die das Stapelungleichgewicht verursacht hat. Beispielmeldung eines Plattformaufrufs der SampleMethod-Methode:

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.

Konfiguration

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

Siehe auch

Konzepte

Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Übersicht über das Interop-Marshalling

Referenz

MarshalAsAttribute

Weitere Ressourcen

Interoperabilität