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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla