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.
Remarque |
---|
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
Concepts
Diagnostic d'erreurs avec les Assistants de débogage managés