Delen via


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>

Zie ook