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

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

Poznámka

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

Příznaky

Chybové ukončení nebo nevysvětlitelná poškození haldy

Příčina

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

Následující tabulka uvádí funkce, které tento ladění MDA sleduje.

Modul Funkce
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

Možnost poškození haldy je pro tuto podmínku AppDomain vysoká, protože volání může uvolnit zatížení. Pokud dojde k AppDomain uvolnění, kód aplikace buď uvolní paměť pro překrývající se ukazatel, což způsobí poškození po dokončení operace, nebo kód nevratí paměť, což způsobí potíže později.

Řešení

Pomocí objektu Overlapped zavoláním Pack metody získáte NativeOverlapped strukturu, kterou lze předat funkci. Pokud dojde k AppDomain uvolnění, modul CLR počká, dokud se asynchronní operace nedokončí, než uvolní ukazatel.

Vliv na modul runtime

Tento mda neměl žá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é