Partilhar via


MDA invalidOverlappedToPinvoke

Nota

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

O invalidOverlappedToPinvoke assistente de depuração gerenciado (MDA) é ativado quando um ponteiro sobreposto que não foi criado na pilha de coleta de lixo é passado para funções específicas do Win32.

Nota

Por padrão, esse MDA é ativado somente se a chamada de chamada de chamada de plataforma estiver definida em seu código e o depurador relatar o status JustMyCode de cada método. Um depurador que não entende JustMyCode (como MDbg.exe sem extensões) não ativará este MDA. Este MDA pode ser habilitado para esses depuradores usando um arquivo de configuração e explicitamente instalado justMyCode="false" no arquivo (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).

Sintomas

Falhas ou corrupções de pilha inexplicáveis.

Motivo

Um ponteiro sobreposto que não foi criado na pilha de coleta de lixo é passado para funções específicas do sistema operacional.

A tabela a seguir mostra as funções que este MDA rastreia.

Módulo Function
HttpApi.dll HttpReceiveHttpRequest
IpHlpApi.dll NotifyAddrChange
kernel32.dll ReadFile
kernel32.dll ReadFileEx
kernel32.dll WriteFile
kernel32.dll WriteFileEx
kernel32.dll ReadDirectoryChangesW
kernel32.dll PostQueuedCompletionStatus
MSWSock.dll ConnectEx
WS2_32.dll WSASend
WS2_32.dll WSASendTo
WS2_32.dll WSARecv
WS2_32.dll WSARecvFrom
MQRT.dll MQReceiveMessage

O potencial de corrupção de pilha é alto para essa condição porque a AppDomain chamada pode ser descarregada. Se o AppDomain descarregar, o código do aplicativo liberará a memória para o ponteiro sobreposto, causando corrupção quando a operação terminar, ou o código vazará a memória, causando dificuldades mais tarde.

Resolução

Use um Overlapped objeto, chamando o Pack método para obter uma NativeOverlapped estrutura que pode ser passada para a função. Se o AppDomain descarregar, o CLR aguardará até que a operação assíncrona seja concluída antes de liberar o ponteiro.

Efeito no tempo de execução

Este MDA não teve efeito sobre o CLR.

Saída

Segue-se um exemplo de saída deste 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 NativeOverlapped structure 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>
    <invalidOverlappedToPinvoke/>
  </assistants>
</mdaConfig>

Consulte também