Compartilhar via


MDA overlappedFreeError

Observação

Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O MDA (Assistente de Depuração Gerenciado) de overlappedFreeError é ativado quando o método Overlapped.Free(NativeOverlapped*) é chamado antes da conclusão da operação sobreposta.

Sintomas

Violações de acesso ou corrupção de heap coletado como lixo.

Causa

Uma estrutura sobreposta foi liberada antes da operação ter sido concluída. A função que está usando o ponteiro sobreposto pode gravar a estrutura mais tarde, depois de ele ter sido liberado. Isso pode causar corrupção de heap porque outro objeto agora pode ocupar essa região.

Esse MDA poderá não representar um erro se a operação sobreposta não for iniciada com êxito.

Resolução

Verifique se a operação de E/S usando a estrutura sobreposta foi concluída antes de chamar o método Free(NativeOverlapped*).

Efeito sobre o runtime

Esse MDA não tem efeito sobre o CLR.

Saída

O demonstrado a seguir é uma saída de exemplo para esse 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.

Configuração

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

Confira também