Udostępnij za pośrednictwem


invalidOverlappedToPinvoke MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .NET, w tym .NET 6 i nowszych wersji.

invalidOverlappedToPinvoke Asystent zarządzanego debugowania (MDA) jest aktywowany, gdy nakładający się wskaźnik, który nie został utworzony na stercie odzyskiwania pamięci, jest przekazywany do określonych funkcji Win32.

Uwaga

Domyślnie ta usługa MDA jest aktywowana tylko wtedy, gdy wywołanie wywołania platformy jest zdefiniowane w kodzie, a debuger zgłasza stan JustMyCode każdej metody. Debuger, który nie rozumie programu JustMyCode (na przykład MDbg.exe bez rozszerzeń), nie aktywuje tej usługi MDA. Tę usługę MDA można włączyć dla tych debugerów przy użyciu pliku konfiguracji i jawnie ustawić justMyCode="false" w pliku (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).

Objawy

Awarie lub niewytłumaczalne uszkodzenia sterta.

Przyczyna

Nakładający się wskaźnik, który nie został utworzony na stercie odzyskiwania pamięci, jest przekazywany do określonych funkcji systemu operacyjnego.

W poniższej tabeli przedstawiono funkcje śledzące przez tę usługę MDA.

Moduł 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

Potencjał uszkodzenia sterta jest wysoki dla tego stanu, ponieważ AppDomain wykonanie wywołania może zwolnić. AppDomain W przypadku zwolnienia kod aplikacji zwolni pamięć dla nakładającego się wskaźnika, powodując uszkodzenie po zakończeniu operacji lub kod spowoduje wyciek pamięci później, powodując trudności.

Rozwiązanie

Overlapped Użyj obiektu , wywołując Pack metodę NativeOverlapped , aby uzyskać strukturę, którą można przekazać do funkcji. W przypadku AppDomain zwolnienia clR czeka na zakończenie operacji asynchronicznej przed zwolnieniem wskaźnika.

Wpływ na środowisko uruchomieniowe

To MDA nie miało wpływu na CLR.

Wyjście

Poniżej przedstawiono przykład danych wyjściowych z tej usługi 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.

Konfigurowanie

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

Zobacz też