Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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>