Поделиться через


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>

См. также