invalidOverlappedToPinvoke MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De invalidOverlappedToPinvoke
beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer een overlappende aanwijzer die niet is gemaakt op de garbagecollection-heap wordt doorgegeven aan specifieke Win32-functies.
Notitie
Deze MDA wordt standaard alleen geactiveerd als de aanroep van het platform wordt gedefinieerd in uw code en het foutopsporingsprogramma de JustMyCode-status van elke methode rapporteert. Een foutopsporingsprogramma dat JustMyCode (zoals MDbg.exe zonder extensies) niet begrijpt, activeert deze MDA niet. Deze MDA kan worden ingeschakeld voor deze foutopsporingsprogramma's met behulp van een configuratiebestand en expliciet instellen justMyCode="false"
in het .mda.config-bestand (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>
).
Symptomen
Crashes of onverklaarbare heap-beschadigingen.
Oorzaak
Een overlappende aanwijzer die niet is gemaakt op de garbagecollection heap, wordt doorgegeven aan specifieke besturingssysteemfuncties.
In de volgende tabel ziet u de functies die door deze MDA worden bijgehouden.
Module | Functie |
---|---|
HttpApi.dll | HttpReceiveHttpRequest |
IpHlpApi.dll | NotifyAddrChange |
kernel32.dll | ReadFile |
kernel32.dll | ReadFileEx |
kernel32.dll | WriteFile |
kernel32.dll | WriteFileEx |
kernel32.dll | ReadDirectoryChangesW |
kernel32.dll | PostQueuedCompletionStatus |
MSWSock.dll | ConnectEx |
WS2_32.dll | WSASend |
WS2_32.dll | WSASendTo |
WS2_32.dll | WSARecv |
WS2_32.dll | WSARecvFrom |
MQRT.dll | MQReceiveMessage |
Het potentieel voor heap-corruptie is hoog voor deze voorwaarde omdat het AppDomain maken van de oproep mogelijk wordt verwijderd. Als de AppDomain uitlaadbewerkingen worden uitgevoerd, maakt de toepassingscode het geheugen vrij voor de overlappende aanwijzer, wat beschadiging veroorzaakt wanneer de bewerking is voltooid, of de code lekt het geheugen, wat later problemen veroorzaakt.
Oplossing
Gebruik een Overlapped object om de Pack methode aan te roepen om een NativeOverlapped structuur op te halen die kan worden doorgegeven aan de functie. Als het AppDomain laden ongedaan wordt gemaakt, wacht de CLR totdat de asynchrone bewerking is voltooid voordat de aanwijzer wordt vrijgemaakt.
Effect op de runtime
Deze MDA had geen effect op de CLR.
Uitvoer
Hier volgt een voorbeeld van uitvoer van deze MDA.
An overlapped pointer (0x00ea3430) that was not allocated on the GC heap was passed via Pinvoke to the Win32 function 'WriteFile' in module 'KERNEL32.DLL'. If the AppDomain is shut down, this can cause heap corruption when the async I/O completes. The best solution is to pass a NativeOverlapped structure retrieved from a call to System.Threading.Overlapped.Pack(). If the AppDomain exits, the CLR will keep this structure alive and pinned until the I/O completes.
Configuratie
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>