Dela via


invalidOverlappedToPinvoke 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 invalidOverlappedToPinvoke hanterade felsökningsassistenten (MDA) aktiveras när en överlappande pekare som inte har skapats på skräpinsamlingens heap skickas till specifika Win32-funktioner.

Kommentar

Som standard aktiveras denna MDA endast om plattformsanropet definieras i koden och felsökaren rapporterar JustMyCode-status för varje metod. Ett felsökningsprogram som inte förstår JustMyCode (till exempel MDbg.exe utan tillägg) aktiverar inte denna MDA. Denna MDA kan aktiveras för dessa felsökare med hjälp av en konfigurationsfil och explicit ange justMyCode="false" i .mda.config-filen (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).

Symtom

Krascher eller oförklarliga heap-skador.

Orsak

En överlappande pekare som inte skapades på skräpinsamlingshögen skickas till specifika operativsystemfunktioner.

I följande tabell visas de funktioner som denna MDA spårar.

Modul Funktion
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

Risken för att heapen skadas är hög för det här villkoret eftersom anropet AppDomain kan ta bort. Om åtgärden AppDomain tas bort frigör programkoden antingen minnet för den överlappande pekaren, vilket orsakar skada när åtgärden är klar, eller så läcker koden minnet, vilket orsakar problem senare.

Åtgärd

Använd ett Overlapped objekt och anropa Pack metoden för att hämta en NativeOverlapped struktur som kan skickas till funktionen. Om den AppDomain tar bort väntar CLR tills den asynkrona åtgärden har slutförts innan pekaren frigörs.

Effekt på körningen

Denna MDA hade ingen effekt på CLR.

Output

Följande är ett exempel på utdata från denna 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.

Konfiguration

<mdaConfig>
  <assistants>
    <invalidOverlappedToPinvoke/>
  </assistants>
</mdaConfig>

Se även