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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro