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>