PInvokeStackImbalance – pomocník spravovaného ladění (MDA)

Pomocník PInvokeStackImbalance spravovaného ladění (MDA) se aktivuje, když CLR zjistí, že hloubka zásobníku po volání volání platformy neodpovídá očekávané hloubce zásobníku vzhledem k konvenci volání zadané v atributu DllImportAttribute a deklaraci parametrů ve spravovaném podpisu.

Mda PInvokeStackImbalance se implementuje jenom pro 32bitové platformy x86.

Poznámka

Ve PInvokeStackImbalance výchozím nastavení je mda zakázané. V sadě Visual Studio 2017 a novějších verzích PInvokeStackImbalance se pomocník mda zobrazí v seznamu Pomocník pro spravované ladění v dialogovém okně Nastavení výjimky (které se zobrazí, když vyberete Ladit>nastavení výjimeksystému Windows>). Zaškrtnutím nebo zrušením zaškrtnutí políčka Přerušit při vyvolání však nelze povolit nebo zakázat MDA; Řídí pouze to, jestli Visual Studio vyvolá výjimku při aktivaci MDA.

Příznaky

Aplikace narazí na narušení přístupu nebo poškození paměti při volání nebo sledování volání platformy.

Příčina

Spravovaný podpis volání volání platformy nemusí odpovídat nespravovanému podpisu volané metody. Tato neshoda může být způsobena tím, že spravovaný podpis nehlásí správný počet parametrů nebo nezadá odpovídající velikost parametrů. MDA může také aktivovat, protože konvence volání, pravděpodobně určená atributem DllImportAttribute , neodpovídá konvenci nespravovaného volání.

Řešení

Zkontrolujte podpis volání spravované platformy a konvenci volání a ověřte, že odpovídá podpisu a konvenci volání nativního cíle. Zkuste explicitně zadat konvenci volání na spravované i nespravované straně. Je také možné, i když ne tak pravděpodobné, že nespravovaná funkce nevyrovnála zásobník z nějakého jiného důvodu, například kvůli chybě v nespravovaném kompilátoru.

Vliv na modul runtime

Vynutí, aby všechna volání volání volání platformy přecházela neoptimalizovanou cestu v CLR.

Výstup

Zpráva MDA obsahuje název volání metody vyvolání platformy, která způsobuje nerovnováhu zásobníku. Ukázková zpráva volání volání platformy pro metodu SampleMethod je:

Volání funkce PInvoke SampleMethod rozbilo zásobník. Důvodem je pravděpodobně to, že spravovaný podpis PInvoke neodpovídá nespravovanému cílovému podpisu. Zkontrolujte, že konvence volání a parametry podpisu PInvoke odpovídají cílovému nespravovanému podpisu.

Konfigurace

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

Viz také