invalidOverlappedToPinvoke MDA
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник по отладке управляемого кода (MDA) invalidOverlappedToPinvoke
активируется, когда перекрытый указатель, который не был создан в куче сбора мусора, передается конкретным функциям Win32.
Примечание.
По умолчанию данный MDA активируется, только если в коде определен платформенный вызов, и отладчик сообщает о статусе JustMyCode для каждого метода. Отладчик, который не понимает JustMyCode (например, MDbg.exe без расширений), не будет активировать данный MDA. Этот MDA можно включить для таких отладчиков с помощью файла конфигурации и явно задав justMyCode="false"
в файле .mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>
.
Симптомы
Сбои или необъяснимые повреждения кучи.
Причина
Перекрытый указатель, который не был создан в куче сборки мусора, передается конкретным функциям операционной системы.
В следующей таблице приведены функции, отслеживаемые данным MDA.
Модуль | Function |
---|---|
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 ожидает завершения асинхронной операции, прежде чем освободить указатель.
Влияние на среду выполнения
Этот помощник отладки управляемого кода не оказывал никакого влияния на среду 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>