InvalidOverlappedToPinvoke MDA

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>

См. также