invalidOverlappedToPinvoke MDA
Обновлен: Ноябрь 2007
Управляемый помощник по отладке (MDA) invalidOverlappedToPinvoke активируется, когда перекрывающийся указатель, созданный не в куче, где производится сборка мусора, передается определенным функциям Win32.
Примечание. |
---|
По умолчанию данный 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>
См. также
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке
Общие сведения о маршалинге взаимодействия