Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Note
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник invalidOverlappedToPinvoke по управляемой отладке активируется, когда перекрывающийся указатель, который не был создан в куче сборки мусора, передается определенным функциям Win32.
Note
По умолчанию этот MDA активируется только в том случае, если вызов платформы определен в коде, а отладчик сообщает состояние JustMyCode каждого метода. Отладчик, который не понимает JustMyCode (например, MDbg.exe без расширений), не активирует этот MDA. Этот MDA можно включить для этих отладчиков с помощью файла конфигурации и явного задания justMyCode="false" в файле (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config).
Симптомы
Сбои или необъяснимые повреждения кучи.
Причина
Перекрывающийся указатель, который не был создан в куче сборки мусора, передается определенным функциям операционной системы.
В следующей таблице показаны функции, отслеживаемые этим MDA.
| Модуль | Функция |
|---|---|
| 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 |
Потенциал повреждения кучи высок для этого условия, так как AppDomain вызов может выгрузить. AppDomain Если выгрузится, код приложения либо освободит память для перекрывающегося указателя, что приведет к повреждению при завершении операции, либо код будет утечкой памяти, что приведет к трудностям позже.
Разрешение
Overlapped Используйте объект, вызывая Pack метод, чтобы получить NativeOverlapped структуру, которую можно передать в функцию. AppDomain Если выгрузка выполняется, среда CLR ожидает завершения асинхронной операции перед освобождением указателя.
Влияние на среду выполнения
Эта MDA не повлияла на CLR.
Выходные данные
Ниже приведен пример выходных данных из этого MDA.
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.
Конфигурация
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>