Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.
Der invalidOverlappedToPinvoke verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird aktiviert, wenn ein überlappender Zeiger, der nicht für den Garbage Collection-Heap erstellt wurde, an bestimmte Win32-Funktionen übergeben wird.
Note
Standardmäßig wird dieser MDA nur aktiviert, wenn der Plattformaufruf in Ihrem Code definiert ist und der Debugger den JustMyCode-Status jeder Methode meldet. Ein Debugger, der JustMyCode (z. B. MDbg.exe ohne Erweiterungen) nicht versteht, aktiviert diese MDA nicht. Dieser MDA kann für diese Debugger aktiviert werden, indem eine Konfigurationsdatei verwendet und in der .mda.config Datei (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>explizit festgelegt justMyCode="false" wird).
Symptome
Abstürze oder unerklärliche Heapbeschädigungen.
Ursache
Ein überlappender Zeiger, der nicht für den Garbage Collection-Heap erstellt wurde, wird an bestimmte Betriebssystemfunktionen übergeben.
In der folgenden Tabelle sind die Funktionen aufgeführt, die von diesem MDA nachverfolgt werden.
| Modul | Funktion |
|---|---|
| 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 |
Das Potenzial für Heapbeschädigungen ist für diese Bedingung hoch, da der AppDomain Anruf möglicherweise entladen wird. Wenn das AppDomain Entladen entladen wird, gibt der Anwendungscode entweder den Speicher für den überlappenden Zeiger frei, was zu Beschädigungen führt, wenn der Vorgang abgeschlossen ist, oder der Code macht den Speicher verloren, was zu späteren Problemen führt.
Auflösung
Verwenden Sie ein Overlapped Objekt, und rufen Sie die Pack Methode auf, um eine NativeOverlapped Struktur abzurufen, die an die Funktion übergeben werden kann. Wenn das AppDomain Entladen erfolgt, wartet die CLR, bis der asynchrone Vorgang abgeschlossen ist, bevor der Zeiger freigegeben wird.
Effekt auf die Laufzeit
Dieser MDA hat keine Auswirkungen auf die CLR.
Output
Im Folgenden sehen Sie ein Beispiel für die Ausgabe dieses 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.
Konfiguration
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>