invalidOverlappedToPinvoke MDA
O invalidOverlappedToPinvoke Assistente de depuração gerenciada (MDA) é ativado quando um ponteiro sobreposto que não foi criado no heap de coleta de lixo é passado para funções específicas do Win32.
Observação
Por padrão, este MDA é ativado somente se o invocação de plataforma chamada é definida no seu código e o depurador relata o status de JustMyCode de cada método (consulte Como: Basta entrar meu código.).Um depurador que não entende o JustMyCode (como MDbg.exe, sem extensão) não será ativado este MDA.Este MDA pode ser habilitado para os depuradores usando um arquivo de configuração e explicitamente configurar justMyCode="false" na. o arquivo de mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).
Sintomas
Falha ou corrupção de heap inexplicáveis.
Causa
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.
Module |
Função |
---|---|
Httpapi |
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 |
A possibilidade de corrupção de heap é alta para essa condição porque o AppDomain fazendo a chamada pode descarregar. Se a AppDomain descarrega, o código do aplicativo ou liberará a memória para o ponteiro sobreposta, causando danos quando a operação for concluída, ou o código será vazamento de memória, causando dificuldades posteriormente.
Resolução
Use um Overlapped o objeto, chamando o Pack método para obter um NativeOverlapped estrutura que pode ser passada para a função. Se o AppDomain descarrega, o CLR esperará até que a operação assíncrona seja concluída antes de liberar o ponteiro.
Efeito sobre o tempo de execução.
Este MDA não tinha nenhum efeito sobre o CLR.
Saída
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>