Freigeben über


PInvokeStackImbalance-MDA

Hinweis

Dieser Artikel gilt für das .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der PInvokeStackImbalance verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird aktiviert, wenn die CLR erkennt, dass die Stapeltiefe nach einem Aufruf der Plattform nicht mit der erwarteten Stapeltiefe übereinstimmt, da die im Attribut DllImportAttribute angegebene Aufrufkonvention und die Deklaration der Parameter in der verwalteten Signatur nicht übereinstimmen.

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

Hinweis

Die PInvokeStackImbalance MDA ist standardmäßig deaktiviert. In Visual Studio 2017 und höheren Versionen wird der PInvokeStackImbalance MDA in der Liste der verwalteten Debugging-Assistenten im Dialogfeld Ausnahmeeinstellungen angezeigt (das angezeigt wird, wenn Sie Debug>Windows>Ausnahmeeinstellungen) auswählen). Wenn Sie jedoch das Kontrollkästchen Unterbrechen beim Auslösen aktivieren oder deaktivieren, wird der MDA nicht aktiviert bzw. deaktiviert; hierdurch wird nur festgelegt, ob Visual Studio beim Aktivieren des MDAs eine Ausnahme auslöst.

Symptome

Während eines Plattformaufrufs in einer Anwendung oder danach kommt es zu einer Zugriffsverletzung oder Speicherbeschädigung.

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 nicht verwalteten Compiler.

Auswirkungen auf die Laufzeit

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

Output

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

Ein Aufruf der PInvoke-Funktion „SampleMethod“ hat den Stapel nicht ausgeglichen. Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der der unverwalteten Zielsignatur übereinstimmt. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur der nicht verwalteten Zielsignatur entsprechen.

Konfiguration

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

Siehe auch