Compartir vía


MDA de overlappedFreeError

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El Asistente para la depuración administrada (MDA) overlappedFreeError se activa cuando se llama al método Overlapped.Free(NativeOverlapped*) antes de que se haya completado la operación superpuesta.

Síntomas

Infracciones de acceso o daños en el montón de recolección de elementos no utilizados.

Causa

Una estructura superpuesta se liberó antes de finalizar la operación. Es posible que la función que está usando el puntero superpuesto escriba en la estructura más adelante, después de que se haya liberado. Esto puede provocar daños en el montón porque es posible que ahora otro objeto ocupe esa región.

Es posible que este MDA no represente un error si la operación superpuesta no se inició correctamente.

Solución

Asegúrese de que se complete la operación de E/S que usa la estructura superpuesta antes de llamar al método Free(NativeOverlapped*).

Efecto en el Runtime

Este MDA no tiene ningún efecto en el CLR.

Output

A continuación puede ver un resultado de ejemplo para este MDA.

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.

Configuración

<mdaConfig>
  <assistants>
    <overlappedFreeError/>
  </assistants>
</mdaConfig>

Consulte también