Sdílet prostřednictvím


invalidOverlappedToPinvoke – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Pomocník invalidOverlappedToPinvoke pro spravované ladění (MDA) se aktivuje, když se do konkrétních funkcí Win32 předá překrývající se ukazatel, který nebyl vytvořen v haldě uvolňování paměti.

Poznámka:

Ve výchozím nastavení je tato MDA aktivována pouze v případě, že volání volání platformy je definováno v kódu a ladicí program hlásí stav JustMyCode každé metody. Ladicí program, který nerozumí justMyCode (například MDbg.exe bez rozšíření), tento mdA neaktivuje. Tuto sadu MDA lze pro tyto ladicí programy povolit pomocí konfiguračního souboru a explicitně nastavit justMyCode="false" v souboru (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).

Příznaky

Dochází k chybám nebo nesvětlitelným poškození haldy.

Příčina

Překrývající se ukazatel, který nebyl vytvořen v haldě uvolňování paměti, se předává konkrétním funkcím operačního systému.

Následující tabulka ukazuje funkce, které tato mdA sleduje.

Modul 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

Potenciál poškození haldy je pro tuto podmínku vysoký, protože AppDomain volání by mohlo uvolnit. Pokud se AppDomain uvolní, kód aplikace uvolní paměť pro překrývající se ukazatel, což způsobí poškození po dokončení operace nebo kód nevracení paměti, což později způsobí potíže.

Rozlišení

Overlapped Použijte objekt, který volá metodu PackNativeOverlapped k získání struktury, kterou lze předat funkci. Pokud se AppDomain uvolní, CLR počká, dokud se asynchronní operace nedokončí, a teprve potom ukazatel uvolní.

Vliv na modul runtime

Tato mda neměla žádný vliv na CLR.

Výstup

Následuje příklad výstupu z tohoto 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.

Konfigurace

<mdaConfig>
  <assistants>
    <invalidOverlappedToPinvoke/>
  </assistants>
</mdaConfig>

Viz také