invalidOverlappedToPinvoke MDA
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 to rozwiązanie MDA jest aktywowane 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 tego rozwiązania MDA. To rozwiązanie 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, które śledzi ta usługa MDA.
Moduł | Funkcja |
---|---|
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 |
Potencjalne uszkodzenie stert jest wysokie dla tego stanu, ponieważ AppDomain wykonanie wywołania może zwolnić. AppDomain Jeśli zwalnia, kod aplikacji zwolni pamięć dla nakładającego się wskaźnika, powodując uszkodzenie po zakończeniu operacji lub kod będzie wyciekać pamięć, powodując trudności później.
Rozwiązanie
Overlapped Użyj obiektu, wywołując Pack metodę NativeOverlapped , aby uzyskać strukturę, którą można przekazać do funkcji. AppDomain Jeśli zwalnia, 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.
Dane wyjściowe
Poniżej przedstawiono przykład danych wyjściowych z tego rozwiązania 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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla