Partager via


Assistant Débogage managé invalidOverlappedToPinvoke

Remarque

Cet article est spécifique au .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.

L’Assistant Débogage managé invalidOverlappedToPinvoke est activé quand un pointeur superposé qui n’a pas été créé sur le tas du garbage collection est passé à des fonctions Win32 spécifiques.

Notes

Par défaut, cet Assistant Débogage managé est activé uniquement si l’appel de code non managé est défini dans votre code et que le débogueur signale l’état JustMyCode de chaque méthode. Un débogueur qui ne comprend pas JustMyCode (tel que MDbg.exe sans extension) n’activera pas cet Assistant. Il peut être activé pour ces débogueurs en utilisant un fichier de configuration et en définissant explicitement justMyCode="false" dans le fichier de configuration .mda (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).

Symptômes

Incidents ou altérations de tas inexplicables.

Cause

Un pointeur superposé qui n’a pas été créé sur le tas du garbage collection est passé à des fonctions spécifiques du système d’exploitation.

Le tableau suivant répertorie les fonctions dont cet Assistant Débogage managé assure le suivi.

Module Fonction
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

Le risque d’altération de tas est élevé pour cette condition, car l’AppDomain effectuant l’appel peut être déchargé. En cas de déchargement d’AppDomain, soit le code d’application libérera de la mémoire pour le pointeur superposé, donnant lieu à une altération au terme de l’opération, soit le code provoquera une fuite de mémoire, entraînant des problèmes ultérieurs.

Résolution

Utilisez un objet Overlapped, appelant la méthode Pack pour obtenir une structure NativeOverlapped qui peut être passée à la fonction. Si l’AppDomain est déchargé, le CLR (Common Language Runtime) attend la fin de l’opération asynchrone avant de libérer le pointeur.

Effet sur le runtime

Cet Assistant Débogage managé n’a aucun effet sur le CLR.

Sortie

L’exemple suivant illustre une sortie de cet Assistant Débogage managé.

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.

Configuration

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

Voir aussi