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>