Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Note
Este artigo é específico para .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O invalidOverlappedToPinvoke MDA (assistente de depuração gerenciada) é ativado quando um ponteiro sobreposto que não foi criado no heap de coleta de lixo é passado para funções específicas do Win32.
Note
Por padrão, esse MDA será ativado somente se a chamada de invocação de plataforma for definida em seu código e o depurador relatar o status justMyCode de cada método. Um depurador que não entende o JustMyCode (como MDbg.exe sem extensões) não ativará esse MDA. Esse MDA pode ser habilitado para esses depuradores usando um arquivo de configuração e definindo justMyCode="false" explicitamente no arquivo (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config).
Symptoms
Falhas ou corrupçãos inexplicáveis.
Cause
Um ponteiro sobreposto que não foi criado no heap 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 | Função |
|---|---|
| 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 heap é alto para essa condição porque a AppDomain chamada pode descarregar. Se o AppDomain descarregamento, o código do aplicativo liberará a memória do ponteiro sobreposto, causando corrupção quando a operação for concluída ou o código vazará a memória, causando dificuldades posteriormente.
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 descarregamento, o CLR aguarda até que a operação assíncrona seja concluída antes de liberar o ponteiro.
Efeito no Runtime
Esse MDA não teve nenhum efeito sobre o CLR.
Saída
Veja a seguir 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>