invalidOverlappedToPinvoke MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez 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 egy átfedésben lévő mutató, amely nem a szemétgyűjtési halomon lett létrehozva, adott Win32-függvények számára lesz átadva.
Feljegyzés
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ő (például MDbg.exe bővítmények nélkül) nem aktiválja 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"
az .mda.config fájlban (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>
).
Hibajelenségek
Összeomlások vagy megmagyarázhatatlan halomsérülések.
Ok
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.
Modul | Függvény |
---|---|
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 (Osztás)
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.
Hozam
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>