MDA de invalidOverlappedToPinvoke
El Asistente para depuración administrada (MDA) invalidOverlappedToPinvoke se activa cuando un puntero superpuesto que no se ha creado en el montón de recolección de elementos no utilizados se pasa a funciones de Win32 específicas.
Nota |
---|
De forma predeterminada, este MDA sólo se activa si se define la llamada de invocación de plataforma en el código y el depurador informa del estado de JustMyCode de cada método (vea Cómo: Avanzar en Sólo mi código).Un depurador que no entienda JustMyCode (como MDbg.exe sin extensiones) no activará este MDA,aunque este MDA se puede habilitar en este tipo de depuradores utilizando un archivo de configuración y estableciendo explícitamente justMyCode="false" en el archivo .mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>). |
Síntomas
Bloqueos o daños inexplicables del montón.
Motivo
Se pasa un puntero superpuesto que no se ha creado en el montón de recolección de elementos no utilizados a funciones de sistema operativo concretas.
La tabla siguiente muestra las funciones de las que realiza el seguimiento este MDA.
Módulo |
Función |
---|---|
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 |
La probabilidad de daños en el montón es alta para esta condición porque se podría descargar el AppDomain que hace la llamada. Si se descarga el AppDomain, el código de la aplicación liberará la memoria del puntero superpuesto, provocando daños cuando termine la operación, o el código producirá la pérdida de memoria que más adelante causará dificultades.
Resolución
Utilice un objeto Overlapped, llamando al método Pack para obtener una estructura NativeOverlapped que se puede pasar a la función. Si se descarga el AppDomain, CLR espera hasta que la operación asincrónica finalice antes de liberar el puntero.
Efecto en el tiempo de ejecución
Este MDA no tiene ningún efecto en CLR.
Output
Lo siguiente es un ejemplo de resultado de este 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.
Configuración
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>
Vea también
Referencia
Conceptos
Diagnóstico de errores con ayudantes de depuraciones administradas