Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Note
Artikel ini khusus untuk .NET Framework. Ini tidak berlaku untuk implementasi .NET yang lebih baru, termasuk .NET 6 dan versi yang lebih baru.
Asisten invalidOverlappedToPinvoke penelusuran kesalahan terkelola (MDA) diaktifkan ketika pointer tumpang tindih yang tidak dibuat pada tumpukan pengumpulan sampah diteruskan ke fungsi Win32 tertentu.
Note
Secara default, MDA ini diaktifkan hanya jika panggilan pemanggilan platform ditentukan dalam kode Anda dan debugger melaporkan status JustMyCode dari setiap metode. Debugger yang tidak memahami JustMyCode (seperti MDbg.exe tanpa ekstensi) tidak akan mengaktifkan MDA ini. MDA ini dapat diaktifkan untuk debugger tersebut dengan menggunakan file konfigurasi dan secara eksplisit justMyCode="false" mengatur dalam file (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).
Gejala
Crash atau kerusakan tumpukan yang tidak dapat dijelaskan.
Penyebab
Pointer tumpang tindih yang tidak dibuat pada tumpukan pengumpulan sampah diteruskan ke fungsi sistem operasi tertentu.
Tabel berikut menunjukkan fungsi yang dilacak MDA ini.
| Module | 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 |
Potensi kerusakan timbunan tinggi untuk kondisi ini karena AppDomain panggilan yang melakukan mungkin dibongkar. AppDomain Jika pembongkaran, kode aplikasi akan membebaskan memori untuk pointer yang tumpang tindih, menyebabkan kerusakan ketika operasi selesai, atau kode akan membocorkan memori, menyebabkan kesulitan nanti.
Resolution
Overlapped Gunakan objek, memanggil Pack metode untuk mendapatkan NativeOverlapped struktur yang dapat diteruskan ke fungsi. Jika pembongkaran AppDomain , CLR menunggu hingga operasi asinkron selesai sebelum membebaskan pointer.
Efek pada Runtime
MDA ini tidak berpengaruh pada CLR.
Hasil
Berikut ini adalah contoh output dari MDA ini.
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.
Konfigurasi
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>