MDA overlappedFreeError

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 overlappedFreeError al debug gestito viene attivato quando il Overlapped.Free(NativeOverlapped*) metodo viene chiamato prima del completamento dell'operazione sovrapposta.

Symptoms

Violazioni di accesso o danneggiamento dell'heap sottoposto a Garbage Collection.

Cause

Una struttura sovrapposta è stata liberata prima del completamento dell'operazione. La funzione che usa il puntatore sovrapposto potrebbe scrivere nella struttura in un secondo momento, dopo che è stata liberata. Ciò può causare il danneggiamento dell'heap perché un altro oggetto potrebbe ora occupare tale area.

Questo assistente al debug gestito potrebbe non rappresentare un errore se l'operazione sovrapposta non è stata avviata correttamente.

Risoluzione

Assicurarsi che l'operazione di I/O che usi la struttura sovrapposta sia stata completata prima di chiamare il Free(NativeOverlapped*) metodo .

Effetto sul runtime

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

Risultato

Di seguito è riportato l'output di esempio per 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 NativeOverlappedStructure 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>
    <overlappedFreeError/>
  </assistants>
</mdaConfig>

Vedere anche