yeniden giriş MDA'sı
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 reentrancy
hata ayıklama yardımcısı (MDA), yönetilen koddan yerel koda önceki bir geçişin düzenli bir geçiş yoluyla gerçekleştirilmediği durumlarda yerel koddan yönetilen koda geçiş girişiminde bulunulduğunda etkinleştirilir.
Belirtiler
Nesne yığını bozuk veya yerel koddan yönetilen koda geçiş sırasında başka ciddi hatalar oluşuyor.
Her iki yönde de yerel ve yönetilen kod arasında geçiş yapan iş parçacıklarının düzenli bir geçiş gerçekleştirmesi gerekir. Ancak, vektörlü özel durum işleyicisi gibi işletim sistemindeki belirli düşük düzeyli genişletilebilirlik noktaları, düzenli bir geçiş gerçekleştirmeden yönetilen koddan yerel koda geçişlere izin verir. Bu anahtarlar, ortak dil çalışma zamanı (CLR) denetimi altında değil işletim sistemi denetimi altındadır. Bu genişletilebilirlik noktalarının içinde yürütülen tüm yerel kodlar, yönetilen koda geri çağrı yapmaktan kaçınmalıdır.
Neden
Yönetilen kod yürütülürken vektörlü özel durum işleyicisi gibi düşük düzeyli bir işletim sistemi genişletilebilirlik noktası etkinleştirildi. Bu genişletilebilirlik noktası aracılığıyla çağrılan uygulama kodu yönetilen koda geri çağrılmaya çalışılıyor.
Bu soruna her zaman uygulama kodu neden olur.
Çözüm
Bu MDA'yi etkinleştiren iş parçacığı için yığın izlemesini inceleyin. İş parçacığı, yönetilen koda yasadışı olarak çağrı yapmaya çalışır. Yığın izlemesi, bu genişletilebilirlik noktasını kullanan uygulama kodunu, bu genişletilebilirlik noktasını sağlayan işletim sistemi kodunu ve genişletilebilirlik noktası tarafından kesilen yönetilen kodu ortaya çıkarmalıdır.
Örneğin, MDA'nın vektörleştirilmiş özel durum işleyicisinin içinden yönetilen kodu çağırma girişiminde etkinleştirildiğini görürsünüz. Yığında, işletim sistemi özel durum işleme kodunu ve veya AccessViolationExceptiongibi DivideByZeroException bir özel durumu tetikleyen bazı yönetilen kodu görürsünüz.
Bu örnekte doğru çözüm, vektörleştirilmiş özel durum işleyicisini tamamen yönetilmeyen kodda uygulamaktır.
Çalışma Zamanı üzerindeki etkisi
Bu MDA'nın CLR üzerinde hiçbir etkisi yoktur.
Çıktı
MDA, yasa dışı yeniden giriş girişiminde bulunulduğunu bildiriyor. Bunun neden gerçekleştiğini ve sorunun nasıl düzeltileceğini belirlemek için iş parçacığı yığınını inceleyin. Aşağıda örnek çıkış verilmiştir.
Additional Information: Attempting to call into managed code without
transitioning out first. Do not attempt to run managed code inside
low-level native extensibility points. Managed Debugging Assistant
'Reentrancy' has detected a problem in 'D:\ConsoleApplication1\
ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe'.
Yapılandırma
<mdaConfig>
<assistants>
<reentrancy />
</assistants>
</mdaConfig>
Örnek
Aşağıdaki kod örneği, bir AccessViolationException atılması neden olur. Vektör özel durum işlemeyi destekleyen Windows sürümlerinde, bu yönetilen vektör özel durum işleyicisinin çağrılmasına neden olur. reentrancy
MDA etkinleştirilirse, MDA işletim sisteminin vektörle özel durum işleme destek kodundan yapılan çağrı MyHandler
sırasında etkinleştirilir.
using System;
public delegate int ExceptionHandler(IntPtr ptrExceptionInfo);
public class Reenter
{
public static ExceptionHandler keepAlive;
[System.Runtime.InteropServices.DllImport("kernel32", ExactSpelling=true,
CharSet=System.Runtime.InteropServices.CharSet.Auto)]
public static extern IntPtr AddVectoredExceptionHandler(int bFirst,
ExceptionHandler handler);
static int MyHandler(IntPtr ptrExceptionInfo)
{
// EXCEPTION_CONTINUE_SEARCH
return 0;
}
void Run() {}
static void Main()
{
keepAlive = new ExceptionHandler(Reenter.MyHandler);
IntPtr ret = AddVectoredExceptionHandler(1, keepAlive);
try
{
// Dispatch on null should AV.
Reenter r = null;
r.Run();
}
catch { }
}
}