Dela via


PInvokeStackImbalance MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den PInvokeStackImbalance hanterade felsökningsassistenten (MDA) aktiveras när CLR identifierar att stackdjupet efter ett plattformsanrop inte matchar det förväntade stackdjupet, med tanke på den anropskonvention som anges i DllImportAttribute attributet och deklarationen av parametrarna i den hanterade signaturen.

PInvokeStackImbalance MDA implementeras endast för 32-bitars x86-plattformar.

Kommentar

PInvokeStackImbalance MDA är inaktiverad som standard. I Visual Studio 2017 och senare versioner PInvokeStackImbalance visas MDA i listan Hanterade felsökningsassistenter i dialogrutan Undantagsinställningar (som visas när du väljer Felsöka>Windows-undantagsinställningar).> Om du markerar eller avmarkerar kryssrutan Bryt vid utlöses aktiveras eller inaktiveras dock inte MDA. Den styr endast om Visual Studio utlöser ett undantag när MDA aktiveras.

Symtom

Ett program stöter på en åtkomstöverträdelse eller minnesskada när ett anrop anropas eller följer en plattform.

Orsak

Den hanterade signaturen för plattformsanropet kanske inte matchar den ohanterade signaturen för den metod som anropas. Det här matchningsfelet kan orsakas av att den hanterade signaturen inte deklarerar rätt antal parametrar eller inte anger lämplig storlek för parametrarna. MDA kan också aktiveras eftersom anropskonventionen, som eventuellt anges av DllImportAttribute attributet, inte matchar den ohanterade anropskonventionen.

Åtgärd

Granska den hanterade plattformen anropa signatur och anropskonvention för att bekräfta att den matchar signatur- och anropskonventionen för det interna målet. Försök att uttryckligen ange anropskonventionen på både hanterade och ohanterade sidor. Det är också möjligt, även om det inte är lika troligt, att den ohanterade funktionen obalanserade stacken av någon annan anledning, till exempel en bugg i den ohanterade kompilatorn.

Effekt på körningen

Tvingar alla plattformsanrop att ta den icke-optimerade sökvägen i CLR.

Output

MDA-meddelandet ger namnet på plattformsanropet som orsakar obalansen i stacken. Ett exempelmeddelande för en plattform som anropar anropsmetoden SampleMethod är:

Ett anrop till PInvoke-funktionen "SampleMethod" har obalanserat stacken. Detta beror troligen på att den hanterade PInvoke-signaturen inte matchar den ohanterade målsignaturen. Kontrollera att anropskonventionen och parametrarna för PInvoke-signaturen matchar den ohanterade målsignaturen.

Konfiguration

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

Se även