Bagikan melalui


invalidOverlappedToPinvoke MDA

Catatan

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 yang tumpang tindih yang tidak dibuat pada heap pengumpulan sampah diteruskan ke fungsi Win32 tertentu.

Catatan

Secara default, MDA ini diaktifkan hanya jika panggilan penggunaan 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 mengatur justMyCode="false" dalam file (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).

Gejala

Crash atau kerusakan heap yang tidak dapat dijelaskan.

Penyebab

Pointer tumpang tindih yang tidak dibuat pada heap pengumpulan sampah diteruskan ke fungsi sistem operasi tertentu.

Tabel berikut ini memperlihatkan fungsi yang dilacak MDA ini.

Modul Fungsi
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 heap tinggi untuk kondisi ini karena AppDomain yang membuat panggilan mungkin dibongkar. Jika AppDomain membongkar, kode aplikasi akan membebaskan memori untuk pointer yang tumpang tindih, menyebabkan kerusakan ketika operasi selesai, atau kode akan membocorkan memori, menyebabkan kesulitan nanti.

Resolusi

Gunakan objek Overlapped, memanggil metode Pack untuk mendapatkan struktur NativeOverlapped yang dapat diteruskan ke fungsi . Jika membongkar AppDomain, CLR menunggu hingga operasi asinkron selesai sebelum membebaskan pointer.

Efek pada Runtime

MDA ini tidak berpengaruh pada CLR.

Output

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>

Lihat juga