Поделиться через


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

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

Признаки

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

Причина

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

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

Решение

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

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

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

Output

Далее приведен пример результата работы данного помощника по отладке управляемого кода.

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>

См. также

Ссылки

MarshalAsAttribute

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Маршалинг взаимодействия