Sdílet prostřednictvím


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

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

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é hloubkě 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:

Služba PInvokeStackImbalance MDA je ve výchozím nastavení zakázaná. V sadě Visual Studio 2017 a novějších verzích PInvokeStackImbalance se sada MDA zobrazí v seznamu Pomocníků pro spravované ladění v dialogovém okně Nastavení výjimek (která se zobrazí po výběru možnosti Ladit>nastavení výjimek systému Windows).> Když ale zaškrtnete nebo zrušíte zaškrtnutí políčka Zrušit při vyvolání , nepovolíte nebo zakážete mdA, řídí pouze to, jestli sada Visual Studio vyvolá výjimku při aktivaci MDA.

Příznaky

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

Příčina

Spravovaný podpis volání vyvolání platformy nemusí odpovídat nespravovanému podpisu volané metody. Příčinou této neshody může být, že spravovaný podpis nehlásí správný počet parametrů nebo nezadá odpovídající velikost parametrů. MdA se také může aktivovat, protože konvence volání, pravděpodobně určená DllImportAttribute atributem, neodpovídá nespravované konvenci volání.

Rozlišení

Zkontrolujte konvenci volání a vyvolání spravované platformy 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 nevyrovnala zásobník z nějakého jiného důvodu, například chybu v nespravovaném kompilátoru.

Vliv na modul runtime

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

Výstup

Zpráva MDA poskytuje název volání metody vyvolání platformy, které způsobuje nevyváženost zásobníku. Ukázková zpráva volání volání SampleMethod volání platformy je:

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

Konfigurace

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

Viz také