Partager via


Assistant Débogage managé invalidOverlappedToPinvoke

L'Assistant Débogage managé (MDA, Managed Debugging Assistant) invalidOverlappedToPinvoke est activé lorsqu'un pointeur superposé qui n'a pas été créé sur le tas du garbage collection est passé à des fonctions Win32 spécifiques.

RemarqueRemarque

Par défaut, ce MDA 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 (consultez Comment : effectuer un pas à pas détaillé dans Uniquement mon code).Un débogueur qui ne comprend pas JustMyCode (tel que MDbg.exe sans extension) n'activera pas ce MDA.Ce MDA 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 le AppDomain effectuant l'appel peut être déchargé. En cas de déchargement de AppDomain, soit le code d'application libérera de la mémoire pour le pointeur superposé, donnant lieu à une altération du tas GC au terme de l'opération, soit le code provoquera une fuite de mémoire, entraînant des problèmes ultérieurs.

Solution

Utilisez un objet Overlapped, appelant la méthode Pack pour obtenir une structure NativeOverlapped qui peut être passée à la fonction. Si le 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

Le message suivant constitue un exemple de 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

Référence

MarshalAsAttribute

Concepts

Diagnostic d'erreurs avec les Assistants de débogage managés

Marshaling d'interopérabilité