Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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>