Megosztás a következőn keresztül:


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>

Lásd még