invalidOverlappedToPinvoke MDA

Note

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 gerido (MDA) é ativado quando um ponteiro sobreposto que não foi criado na pilha de recolha de lixo é passado para funções específicas do Win32.

Note

Por defeito, este MDA só é ativado se a chamada de invocação da plataforma estiver definida no seu código e o depurador reportar o estado do JustMyCode de cada método. Um depurador que não compreenda o JustMyCode (como MDbg.exe sem extensões) não ativará este MDA. Este MDA pode ser ativado para esses depuradores usando um ficheiro de configuração e estabelecendo justMyCode="false" explicitamente no ficheiro (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config).

Sintomas

Crashes ou corrupções inexplicáveis do heap.

Motivo

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

A tabela seguinte mostra as funções que este MDA acompanha.

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 do heap é elevado nesta condição, pois a AppDomain decisão pode ser descarregada. Se descarregar AppDomain , o código da aplicação libertará a memória para o ponteiro sobreposto, causando corrupção quando a operação terminar, ou o código irá 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 possa ser passada à função. Se descarregar AppDomain , o CLR espera que a operação assíncrona seja concluída antes de libertar o apontador.

Efeito no tempo de execução

Este MDA não teve qualquer efeito no CLR.

Output

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>

Ver também