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>