PInvokeStackImbalance MDA

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 atrybucie DllImportAttribute i deklarację parametrów w podpisie zarządzanym.

MdA PInvokeStackImbalance jest implementowany tylko dla 32-bitowych platform x86.

Uwaga

MdA PInvokeStackImbalance 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 systemuWindows>). Jednak zaznaczenie lub wyczyszczenie pola wyboru Przerwij po wyrzuceniu nie włącza ani nie wyłącza MDA; Określa tylko, czy program Visual Studio zgłasza wyjątek po aktywowaniu usługi MDA.

Objawy

Aplikacja napotyka naruszenie dostępu lub uszkodzenie pamięci podczas wykonywania wywołania platformy lub po wywołaniu platformy.

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 prawidłowej 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 stronach zarządzanych i niezarządzanych. Istnieje również możliwość, chociaż nie jest prawdopodobne, ż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ływanie wszystkich wywołań platformy w celu podjęcia niezoptymalizowanej ścieżki w środowisku CLR.

Dane wyjściowe

Komunikat MDA zawiera nazwę wywołania metody wywołania platformy, które powoduje nierównowagę stosu. Przykładowy komunikat wywołania metody wywołania SampleMethod platformy to:

Wywołanie funkcji PInvoke "SampleMethod" nie zrównoważyło stosu. Prawdopodobnie jest to spowodowane tym, że zarządzany podpis PInvoke nie jest zgodny z niezarządzaną sygnaturą docelową. Sprawdź, czy konwencja wywoływania i parametry podpisu PInvoke są zgodne z sygnaturą niezarządzaną docelową.

konfiguracja

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

Zobacz też