invalidOverlappedToPinvoke MDA
The 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 de Win32.
Observação: |
---|
Por padrão, isso O MDA é ativado somente Se invocação de plataforma chamadas é definida em seu código e o depurador relata o status JustMyCode de cada método (consulte Como: Etapa em Just My Code).Um depurador que não entende JustMyCode (sistema autônomo MDbg.exe sem extensão) não será ativado para este MDA.Este MDA pode ser habilitado para os depuradores usando um arquivo de configuração e explicitamente settting justMyCode="false" na. mda.config arquivo (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>). |
Sintomas
Falha ou corrupção de heap unexplainable.
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 controla este MDA.
Module |
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 |
A possibilidade de corrupção de pilha é alta para essa condição porque o AppDomain fazendo a telefonar pode descarregar. Se o 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á vazar a memória, causando dificuldades posteriormente.
Resolução
Usar 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 aguarda até que a operação assíncrono for concluída antes de liberar o ponteiro.
Efeito sobre o tempo de execução
Este MDA não tinha nenhum efeito no 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>
Consulte também
Conceitos
Diagnosticar erros com assistentes de depuração gerenciadas
Visão geral do empacotamento interop