Aracılığıyla paylaş


invalidOverlappedToPinvoke MDA

Not

Bu makale .NET Framework'e özgüdür. .NET 6 ve sonraki sürümleri de dahil olmak üzere daha yeni .NET uygulamaları için geçerli değildir.

Yönetilen invalidOverlappedToPinvoke hata ayıklama yardımcısı (MDA), çöp toplama yığınında oluşturulmamış çakışan bir işaretçi belirli Win32 işlevlerine geçirildiğinde etkinleştirilir.

Not

Varsayılan olarak, bu MDA yalnızca platform çağırma çağrısı kodunuzda tanımlandığında etkinleştirilir ve hata ayıklayıcı her yöntemin JustMyCode durumunu bildirir. JustMyCode'u anlamayan bir hata ayıklayıcı (uzantısız MDbg.exe gibi) bu MDA'ı etkinleştirmez. Bu MDA, bir yapılandırma dosyası kullanılarak ve .mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>dosyasında açıkça ayarlanarak justMyCode="false" bu hata ayıklayıcılar için etkinleştirilebilir.

Belirtiler

Kilitlenmeler veya açıklanamayan yığın bozulmaları.

Neden

Çöp toplama yığınında oluşturulmamış çakışan bir işaretçi belirli işletim sistemi işlevlerine geçirilir.

Aşağıdaki tabloda bu MDA'nın izlediği işlevler gösterilmektedir.

Modül İşlev
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

Çağrının yapılması kaldırılabileceğinden, bu koşul AppDomain için yığın bozulması olasılığı yüksektir. AppDomain Kaldırılırsa, uygulama kodu çakışan işaretçi için belleği boşaltarak işlem tamamlandığında bozulmaya neden olur veya kod belleği sızdırarak daha sonra sorunlara neden olur.

Çözüm

İşleve Pack geçirilebilen bir Overlapped yapı elde etmek için yöntemini çağıran bir NativeOverlapped nesnesi kullanın. AppDomain kaldırılırsa, CLR işaretçiyi boşaltmadan önce zaman uyumsuz işlem tamamlanana kadar bekler.

Çalışma Zamanı üzerindeki etkisi

Bu MDA'nın CLR üzerinde hiçbir etkisi yoktu.

Çıktı

Aşağıda bu MDA çıktısının bir örneği verilmiştir.

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.

Yapılandırma

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

Ayrıca bkz.