MDA invalidOverlappedToPinvoke

Note

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.

L'assistente invalidOverlappedToPinvoke al debug gestito viene attivato quando un puntatore sovrapposto non creato nell'heap di Garbage Collection viene passato a funzioni Win32 specifiche.

Note

Per impostazione predefinita, questo assistente al debug gestito viene attivato solo se la chiamata platform invoke è definita nel codice e il debugger segnala lo stato JustMyCode di ogni metodo. Un debugger che non riconosce JustMyCode (ad esempio MDbg.exe senza estensioni) non attiverà questo assistente al debug gestito. Questo assistente al debug gestito può essere abilitato per tali debugger usando un file di configurazione e impostando justMyCode="false" in modo esplicito nel file (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config .

Symptoms

Arresti anomali o danneggiamenti dell'heap inspiegabili.

Cause

Un puntatore sovrapposto che non è stato creato nell'heap di Garbage Collection viene passato a funzioni specifiche del sistema operativo.

La tabella seguente illustra le funzioni tracciate da questo assistente al debug gestito.

Modulo Function
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

Il rischio di danneggiamento dell'heap è elevato per questa condizione perché l'esecuzione AppDomain della chiamata potrebbe essere scaricata. Se l'operazione AppDomain viene scaricata, il codice dell'applicazione libera la memoria per il puntatore sovrapposto, causando danneggiamento al termine dell'operazione oppure il codice perderà la memoria, causando difficoltà in un secondo momento.

Risoluzione

Usare un Overlapped oggetto , chiamando il Pack metodo per ottenere una NativeOverlapped struttura che può essere passata alla funzione . Se l'oggetto AppDomain viene scaricato, CLR attende il completamento dell'operazione asincrona prima di liberare il puntatore.

Effetto sul runtime

Questo assistente al debug gestito non ha avuto alcun effetto su CLR.

Risultato

Di seguito è riportato un esempio di output di questo assistente al debug gestito.

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.

Configuration

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

Vedere anche