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


invalidOverlappedToPinvoke MDA

Обновлен: Ноябрь 2007

Управляемый помощник по отладке (MDA) invalidOverlappedToPinvoke активируется, когда перекрывающийся указатель, созданный не в куче, где производится сборка мусора, передается определенным функциям Win32.

ms228991.alert_note(ru-ru,VS.90).gifПримечание.

По умолчанию данный MDA активируется только в том случае, если в коде определен платформенный вызов, и отладчик выводит отчет о статусе JustMyCode для каждого метода (см. Практическое руководство. Переход в пошаговый режим выполнения "Только мой код"). Отладчик, который не понимает JustMyCode (например, MDbg.exe без расширений), не активирует данный MDA. Данный MDA может быть включен для таких отладчиков с помощью файла конфигурации и настройки justMyCode="false" явным образом в файле MDA.CONFIG (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).

Признаки

Сбой или необъяснимые повреждения кучи.

Причина

Перекрывающийся указатель, не созданный в куче, в которой производится сборка мусора, передается определенным функциям операционной системы.

В следующей таблице приведены функции, которые отслеживает данный 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>

См. также

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Общие сведения о маршалинге взаимодействия

Ссылки

MarshalAsAttribute