Condividi tramite


MDA invalidOverlappedToPinvoke

Aggiornamento: novembre 2007

L'assistente al debug gestito (MDA, Managed Debugging Assistant) invalidOverlappedToPinvoke viene attivato quando un puntatore sovrapposto non creato nell'heap del Garbage Collection viene passato a specifiche funzioni Win32.

Nota:

Per impostazione predefinita, questo MDA viene attivato solo se la chiamata pInvoke è definita nel codice e il debugger visualizza lo stato JustMyCode di ciascun metodo. Per informazioni, vedere Procedura: eseguire l'istruzione Just My Code. Questo assistente al debug gestito non viene attivato dai debugger che non sono in grado di comprendere JustMyCode, ad esempio MDbg.exe senza estensioni. This MDA can be enabled for those debuggers by using a configuration file and explicitly settting justMyCode="false" in the .mda.config file (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).

Sintomi

Blocco del sistema o danneggiamento inspiegabile dell'heap.

Causa

Un puntatore sovrapposto non creato nell'heap del Garbage Collection viene passato a specifiche funzioni del sistema operativo.

Nella tabella riportata di seguito sono elencate le funzioni controllate da questo assistente al debug gestito.

Modulo

Funzione

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 possibilità di danneggiamento dell'heap è elevata poiché la classe AppDomain che esegue la chiamata potrebbe essere scaricata. In questo caso, il codice dell'applicazione libererà la memoria per il puntatore sovrapposto, causando il danneggiamento al termine dell'operazione, oppure perderà la memoria, generando problemi in un secondo momento.

Soluzione

Utilizzare un oggetto Overlapped, chiamando il metodo Pack per ottenere una struttura NativeOverlapped da passare alla funzione. Se la classe AppDomain viene scaricata, il puntatore verrà liberato solo al termine dell'operazione asincrona.

Effetti su Common Language Runtime

Questo assistente al debug gestito non ha alcun effetto su Common Language Runtime (CLR).

Output

Di seguito è riportato un esempio di output generato da questo assistente al debug gestito.

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.

Configurazione

<mdaConfig>
  <assistants>
    <invalidOverlappedToPinvoke/>
  </assistants>
</mdaConfig>

Vedere anche

Concetti

Diagnostica degli errori tramite gli assistenti al debug gestito

Cenni preliminari sul marshalling di interoperabilità

Riferimenti

MarshalAsAttribute