Delen via


PInvokeStackImbalance MDA

Notitie

Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.

De PInvokeStackImbalance beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer de CLR detecteert dat de stackdiepte na een aanroep van het platform niet overeenkomt met de verwachte stackdiepte, gezien de aanroepende conventie die is opgegeven in het DllImportAttribute kenmerk en de declaratie van de parameters in de beheerde handtekening.

De PInvokeStackImbalance MDA is alleen geïmplementeerd voor 32-bits x86-platforms.

Notitie

De PInvokeStackImbalance MDA is standaard uitgeschakeld. In Visual Studio 2017 en latere versies wordt de PInvokeStackImbalance MDA weergegeven in de lijst met assistenten voor beheerde foutopsporing in het dialoogvenster Uitzonderingsinstellingen (die wordt weergegeven wanneer u Foutopsporingsinstellingen> voor Windows-uitzonderingen>selecteert). Als u echter het selectievakje Break When Throw inschakelt of uitschakelt, wordt de MDA niet ingeschakeld of uitgeschakeld. Alleen wordt bepaald of Visual Studio een uitzondering genereert wanneer de MDA wordt geactiveerd.

Symptomen

Een toepassing ondervindt een toegangsschending of geheugenbeschadiging bij het maken of volgen van een aanroep van een platform.

Oorzaak

De beheerde handtekening van de aanroep van het platform komt mogelijk niet overeen met de onbeheerde handtekening van de methode die wordt aangeroepen. Deze overeenkomst kan worden veroorzaakt doordat de beheerde handtekening niet het juiste aantal parameters declareren of niet de juiste grootte voor de parameters opgeeft. De MDA kan ook worden geactiveerd omdat de aanroepconventie, mogelijk opgegeven door het DllImportAttribute kenmerk, niet overeenkomt met de niet-beheerde oproepconventie.

Oplossing

Controleer de handtekening en oproepconventie van het beheerde platform om te bevestigen dat het overeenkomt met de handtekening en de oproepconventie van het systeemeigen doel. Probeer expliciet de aanroepende conventie op te geven aan zowel de beheerde als onbeheerde zijden. Het is ook mogelijk, hoewel niet zo waarschijnlijk, dat de onbeheerde functie de stack om een andere reden heeft gedebalanceerd, zoals een bug in de niet-beheerde compiler.

Effect op de runtime

Dwingt alle aanroepen van het platform af om het niet-geoptimaliseerde pad in de CLR te nemen.

Uitvoer

Het MDA-bericht geeft de naam van de aanroepmethode van het platform die de stack onevenwichtigheid veroorzaakt. Een voorbeeldbericht van een aanroepmethode SampleMethod voor een platform is:

Een aanroep van de PInvoke-functie 'SampleMethod' heeft de stack niet in balans gebracht. Dit komt waarschijnlijk doordat de beheerde PInvoke-handtekening niet overeenkomt met de onbeheerde doelhandtekening. Controleer of de aanroepende conventie en parameters van de PInvoke-handtekening overeenkomen met de niet-beheerde doelhandtekening.

Configuratie

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

Zie ook