MDA invalidOverlappedToPinvoke
Nota
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.
L'assistente al debug gestito invalidOverlappedToPinvoke
viene attivato quando un puntatore sovrapposto che non è stato creato nell'heap di Garbage Collection viene passato a funzioni Win32 specifiche.
Nota
Per impostazione predefinita, questo assistente al debug gestito viene attivato solo se la chiamata di pInvoke è definita nel codice e tramite il debugger viene segnalato lo stato JustMyCode di ciascun metodo. Un debugger che non riconosce JustMyCode, ad esempio MDbg.exe senza estensioni, non attiva questo assistente al debug gestito. L'assistente al debug gestito può essere abilitato per questi debugger usando un file di configurazione e impostando in modo esplicito justMyCode="false"
nel file con estensione mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>
).
Sintomi
Arresto anomalo o danneggiamento inspiegabile dell'heap.
Causa
Un puntatore sovrapposto che non è stato creato nell'heap di Garbage Collection viene passato a funzioni del sistema operativo specifiche.
La tabella seguente mostra le funzioni monitorate dall'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 |
Il rischio di danneggiamento dell'heap è elevato in questa condizione, perché l'oggetto AppDomain che effettua la chiamata può essere scaricato. Se AppDomain viene scaricato, il codice dell'applicazione libera la memoria per il puntatore sovrapposto, causando il danneggiamento al termine dell'operazione, oppure il codice perde la memoria, provocando difficoltà in seguito.
Risoluzione
Usare un oggetto Overlapped, chiamando il metodo Pack per ottenere una struttura NativeOverlapped che possa essere passata alla funzione. Se AppDomain viene scaricato, CLR attende il completamento dell'operazione asincrona prima di liberare il puntatore.
Effetto sull'ambiente di esecuzione
L'assistente al debug gestito non ha alcun effetto su CLR.
Output
Di seguito è riportato un esempio di output di 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.
Impostazione
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>