Udostępnij za pośrednictwem


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>

Zobacz też