Помощник по отладке управляемого кода overlappedFreeError

Примечание.

Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник по отладке управляемого кода overlappedFreeError (MDA) активируется, если метод Overlapped.Free(NativeOverlapped*) вызывается до завершения перекрывающейся операции.

Симптомы

Нарушение прав доступа или повреждение кучи сбора мусора.

Причина

Перекрывающаяся структура была освобождена до завершения операции. Функция, использующая перекрывающийся указатель, может выполнять запись в структуру позднее, после ее освобождения. Это может привести к повреждению кучи, поскольку требуемая область может быть занята другим объектом.

Этот помощник по отладке управляемого кода может не возвращать ошибку, если перекрывающаяся операция не была успешно запущена.

Разрешение

Прежде чем вызывать метод Free(NativeOverlapped*), убедитесь, что операция ввода-вывода, использующая перекрывающуюся структуру, была завершена.

Влияние на среду выполнения

Этот помощник отладки управляемого кода не оказывает никакого влияния на среду CLR.

Выходные данные

Ниже приведен пример выходных данных для этого помощника по отладке управляемого кода.

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.

Настройка

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

См. также