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>