Partager via


Assistant Débogage managé overlappedFreeError

L'Assistant Débogage managé overlappedFreeError (MDA) est activé lorsque la méthode Overlapped.Free(NativeOverlapped*) est appelée avant la fin de l'opération avec chevauchement.

Symptômes

Accédez aux violations ou endommagement du tas récupéré par le garbage collector.

Cause

Une structure superposée a été libérée avant la fin de l'opération. La fonction qui utilise le pointeur superposé peut écrire ultérieurement dans la structure, après qu'il a été libéré. Cela peut provoquer l'endommagement de tas parce qu'un autre objet peut maintenant occuper cette région.

Ce MDA ne peut pas représenter d'erreur si l'opération superposée n'a pas démarré.

Solution

Assurez-vous que l'opération d'E/S utilisant la structure superposée a terminé avant d'appeler la méthode Free(NativeOverlapped*).

Effet sur le runtime

Ce MDA 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 NativeOverlappedStructure 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>
    <overlappedFreeError/>
  </assistants>
</mdaConfig>

Voir aussi

Référence

MarshalAsAttribute

Concepts

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

Marshaling d'interopérabilité