invalidOverlappedToPinvoke MDA

Note

Ez a cikk a .NET-keretrendszerre vonatkozik. Nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A invalidOverlappedToPinvoke felügyelt hibakeresési segéd (MDA) akkor aktiválódik, ha a szemétgyűjtési halomon nem létrehozott átfedésben lévő mutatót adott Win32-függvények kapják meg.

Note

Alapértelmezés szerint ez az MDA csak akkor aktiválódik, ha a platformhívási hívás definiálva van a kódban, és a hibakereső az egyes metódusok JustMyCode-állapotát jelenti. A JustMyCode-ot nem ismerő hibakeresők (például MDbg.exe bővítmények nélkül) nem aktiválják ezt az MDA-t. Ez az MDA engedélyezhető a hibakeresők számára egy konfigurációs fájl használatával, és explicit módon beállítva justMyCode="false" a .mda.config fájlban (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).

Symptoms

Összeomlások vagy megmagyarázhatatlan halomsérülések.

A probléma oka

A szemétgyűjtési halomon nem létrehozott átfedésben lévő mutató adott operációsrendszer-függvények számára lesz átadva.

Az alábbi táblázat azokat a függvényeket mutatja be, amelyeket ez az MDA követ.

Module Funkció
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

A halom sérülésének lehetősége magas ebben a feltételben, mert a AppDomain hívás indítása kiürítheti azokat. Ha a rendszer kiüríti a AppDomain memóriát, az alkalmazáskód felszabadítja az átfedésben lévő mutató memóriáját, ami sérülést okoz a művelet befejezésekor, vagy a kód kiszivárog a memóriából, ami később nehézségeket okoz.

Resolution

Használjon objektumot Overlapped , és hívja meg a Pack metódust egy NativeOverlapped olyan struktúra lekéréséhez, amely átadható a függvénynek. Ha a rendszer kiüríti a AppDomain műveletet, a CLR megvárja, amíg az aszinkron művelet befejeződik, mielőtt felszabadítja a mutatót.

Effektus a futtatókörnyezetre

Ez az MDA nem volt hatással a CLR-ra.

Kimenet

Az alábbiakban egy példa látható az MDA kimenetére.

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.

Konfiguráció

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

Lásd még