Condividi tramite


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>

Vedi anche