PInvokeStackImbalance MDA

Note

Dieser Artikel ist spezifisch für .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 DllImportAttribute Attribut angegebene Aufrufkonvention und die Deklaration der Parameter in der verwalteten Signatur.

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

Note

Die PInvokeStackImbalance MDA ist standardmäßig deaktiviert. In Visual Studio 2017 und höheren Versionen wird die PInvokeStackImbalance MDA in der Liste verwalteter Debugging-Assistenten im Dialogfeld "Ausnahmeeinstellungen" angezeigt (die beim Auswählen von Debug>Windows>Ausnahmeeinstellungen angezeigt wird). Wenn Sie jedoch das Kontrollkästchen "Beim Auslösen auslösen" aktivieren oder deaktivieren, wird die MDA nicht aktiviert oder deaktiviert. es steuert nur, ob Visual Studio eine Ausnahme auslöst, wenn die MDA aktiviert wird.

Symptome

Bei einer Anwendung tritt beim Ausführen oder Folgen eines Plattformaufrufs eine Zugriffsverletzung oder Speicherbeschädigung auf.

Ursache

Die verwaltete Signatur des Plattformaufrufs entspricht möglicherweise nicht der nicht verwalteten Signatur der aufgerufenen Methode. Diese Übereinstimmung kann durch die verwaltete Signatur verursacht werden, ohne die richtige Anzahl von Parametern zu deklarieren oder die entsprechende Größe für die Parameter nicht anzugeben. Die MDA kann auch aktiviert werden, da die durch das DllImportAttribute Attribut angegebene Aufrufkonvention nicht mit der nicht verwalteten Aufrufkonvention übereinstimmt.

Auflösung

Überprüfen Sie die verwaltete Plattform, um signatur- und anrufkonventionen aufzurufen, um zu bestätigen, dass sie mit der Signatur- und Anrufkonvention des nativen Ziels übereinstimmt. Versuchen Sie explizit, die Aufrufkonvention sowohl auf der verwalteten als auch auf nicht verwalteten Seiten anzugeben. Es ist auch möglich, obwohl nicht so wahrscheinlich, dass die nicht verwaltete Funktion den Stapel aus irgendeinem anderen Grund nicht ausgeglichen hat, z. B. einen Fehler im nicht verwalteten Compiler.

Effekt auf die Laufzeit

Erzwingt alle Aufrufe der Plattform, um den nicht optimierten Pfad in der CLR zu übernehmen.

Output

Die MDA-Nachricht gibt den Namen des Aufrufs der Plattformaufrufmethode an, der das Stapelungleichgewicht verursacht. Eine Beispielmeldung eines Plattformaufrufs für die Methode SampleMethod lautet:

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

Konfiguration

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

Siehe auch