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à