PInvokeStackImbalance MDA
Uwaga
Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.
PInvokeStackImbalance
Asystent zarządzanego debugowania (MDA) jest aktywowany, gdy CLR wykryje, że głębokość stosu po wywołaniu wywołania platformy nie jest zgodna z oczekiwaną głębokością stosu, biorąc pod uwagę konwencję wywoływania określoną w DllImportAttribute atrybucie i deklarację parametrów w podpisie zarządzanym.
Rozwiązanie PInvokeStackImbalance
MDA jest implementowane tylko dla 32-bitowych platform x86.
Uwaga
Usługa PInvokeStackImbalance
MDA jest domyślnie wyłączona. W programie Visual Studio 2017 i nowszych wersjach rozwiązanie PInvokeStackImbalance
MDA jest wyświetlane na liście Asystentów debugowania zarządzanego w oknie dialogowym Ustawienia wyjątków (które jest wyświetlane po wybraniu pozycji Debuguj>ustawienia wyjątku systemu Windows).> Jednak wybranie lub wyczyszczenie pola wyboru Przerwanie po wyrzuceniu nie powoduje włączenia lub wyłączenia usługi MDA. Określa tylko, czy program Visual Studio zgłasza wyjątek po aktywowaniu rozwiązania MDA.
Objawy
Aplikacja napotyka naruszenie dostępu lub uszkodzenie pamięci podczas wykonywania wywołania wywołania platformy lub po jego wywołaniu.
Przyczyna
Zarządzany podpis wywołania wywołania platformy może nie być zgodny z niezarządzanym podpisem wywoływanej metody. Ta niezgodność może być spowodowana tym, że sygnatura zarządzana nie deklaruje poprawnej liczby parametrów lub nie określa odpowiedniego rozmiaru parametrów. MdA może również aktywować, ponieważ konwencja wywoływania, prawdopodobnie określona przez DllImportAttribute atrybut, nie jest zgodna z niezarządzaną konwencją wywoływania.
Rozwiązanie
Przejrzyj zarządzaną platformę wywołującą podpis i konwencję wywoływania, aby potwierdzić, że jest zgodna z konwencją podpisu i wywoływania natywnego obiektu docelowego. Spróbuj jawnie określić konwencję wywoływania po stronie zarządzanej i niezarządzanej. Istnieje również możliwość, że niezarządzana funkcja nie zrównoważyła stosu z jakiegoś innego powodu, na przykład usterkę w kompilatorze niezarządzanym.
Wpływ na środowisko uruchomieniowe
Wymusza wywołania wszystkich platform w celu podjęcia niezoptymalizowanej ścieżki w środowisku CLR.
Wyjście
Komunikat MDA zawiera nazwę wywołania metody wywoływania platformy, które powoduje dysproporcję stosu. Przykładowy komunikat wywołania wywołania metody wywołania SampleMethod
platformy to:
Wywołanie funkcji PInvoke "SampleMethod" nie zrównoważyło stosu. Jest to prawdopodobne, ponieważ zarządzany podpis PInvoke nie jest zgodny z niezarządzaną sygnaturą docelową. Sprawdź, czy konwencja wywoływania i parametry podpisu PInvoke są zgodne z docelowym podpisem niezarządzanych.
Konfigurowanie
<mdaConfig>
<assistants>
<pInvokeStackImbalance />
</assistants>
</mdaConfig>