Microsoft'a özgü istisna işleme mekanizmaları - Microsoft-specific exception handling mechanisms

Microsoft Windows OS ailesi bazılarını kullanıyor istisna işleme temel alan mekanizmalar işletim sistemi ayrıntılar.

Yapılandırılmış İstisna İşleme

Microsoft Structured Exception Handling, Windows için yerel istisna işleme mekanizmasıdır ve aşağıdakiler için öncü bir teknolojidir: Vektörlü İstisna İşleme (VEH).[1] Özellikleri en sonunda mekanizma standart C ++ istisnalarında yoktur (ancak çoğu zorunlu daha sonra tanıtılan diller). SEH, her biri için ayrı ayrı kurulur ve ele alınır. yürütme dizisi.

Kullanım

Microsoft, SEH'yi yalnızca derleyici düzeyinde bir programlama tekniği olarak destekler. MS Visual C ++ derleyicisi, standart olmayan üç anahtar sözcük içerir: __Deneyin, __dışında ve __en sonunda - bu amaç için. Diğer istisna işleme yönleri, bir dizi Win32 API fonksiyonlar,[2] Örneğin, RaiseException SEH istisnalarını manuel olarak yükseltmek için.

Uygulama

IA-32

Her biri yürütme dizisi Windows'ta IA-32 baskı veya WoW64 için öykünme katmanı x86-64 sürüm, belgelenmemiş bir _EXCEPTION_REGISTRATION_RECORD bağlantısına sahip liste başlangıcında Konu Bilgileri Bloğu. __Deneyin ifadesi esas olarak derleyici tanımlı bir EH_prolog işlevi. Bu işlev bir _EXCEPTION_REGISTRATION_RECORD ayırır yığının üzerinde işaret etmek __except_handler3[a] işlev msvcrt.dll,[b] daha sonra kaydı listenin başına ekler. Sonunda __Deneyin blok derleyici tanımlı EH_epilog ters işlemi yapan işlev denir. Bu derleyici tanımlı yordamlardan herhangi biri, Çizgide. Tüm programcı tanımlı __dışında ve __en sonunda bloklar içeriden çağrılır __except_handler3. Programcı tanımlı bloklar mevcutsa, _EXCEPTION_REGISTRATION_RECORD tarafından oluşturulan EH_prolog tarafından kullanılan birkaç ek alanla genişletilir __except_handler3.[3]

Bir istisna olması durumunda Kullanıcı modu kod, işletim sistemi[c] iş parçacığının _EXCEPTION_REGISTRATION_RECORD listesini ayrıştırır ve bir işleyici istisnayı işlediğini bildirene kadar her istisna işleyicisini sırayla çağırır ( geri dönüş değeri ) veya liste tükendi. Listedeki son kişi her zaman kernel32! UnhandledExceptionFilter hangi görüntüler Genel koruma Hatası hata mesajı.[d] Ardından liste bir kez daha dolaşır ve işleyicilere kullanılan kaynakları temizleme şansı verir. Son olarak, yürütme geri döner çekirdek modu[e] işlemin devam ettiği veya sonlandırıldığı yer.

Bu SEH modu ile ilgili patent, US5628016, 2014 yılında sona ermiştir.

x86-64

64 bit Windows üzerindeki SEH, derleyicinin kod oluşturması yerine yalnızca bir tablo kullanmayı içerdiğinden daha basittir.[4][5]

Destek

GCC 4.8+ Mingw-w64 C ++ istisnaları için 64 bit SEH kullanımını destekler. LLVM clang destekleri __Deneyin hem x86 hem de x64'te.[6]

Vektörlü İstisna İşleme

Vectored Exception Handling tanıtıldı Windows XP.[7] Vektörlü İstisna İşleme, aşağıdaki dilleri kullanan Windows programcıları tarafından kullanılabilir hale getirilmiştir: C ++ ve Visual Basic. VEH, Yapılandırılmış İstisna İşleme'nin (SEH) yerini almaz, bunun yerine VEH ve SEH bir arada bulunur ve VEH işleyicileri SEH işleyicilerine göre önceliğe sahiptir.[1][7]SEH ile karşılaştırıldığında VEH, daha çok çekirdek üzerinden teslim edilmiş gibi çalışır Unix sinyalleri.[8]

Notlar

  1. ^ Ad, VC çalışma zamanının farklı sürümlerinde değişiklik gösterir
  2. ^ ntdll.dll ve kernel32.dll, VC çalışma zamanıyla statik olarak bağlantılı diğer programların yanı sıra, bu işlevi derlemek yerine
  3. ^ Daha spesifik olarak, ntdll! RtlDispatchException sistem rutini ntdll! KiUserExceptionDispatcher bu da sırayla nt! KiDispatchException çekirdek işlevi. (Görmek Ken Johnson (16 Kasım 2007). "Kullanıcı modu geri aramalarına NTDLL çekirdek modunun bir kataloğu, bölüm 2: KiUserExceptionDispatcher". detaylar için)
  4. ^ Mesaj, işlemin değiştirilmesiyle susturulabilir. hata modu; varsayılan son işleyici ile değiştirilebilir SetUnhandledExceptionFilter API
  5. ^ ntdll! KiUserExceptionDispatcher ikisini de arar nt! ZwContinue veya nt! ZwRaiseException

Referanslar

  1. ^ a b "Windows Server 2003'te Vektörlü İstisna İşleme (İnternet Arşivi Üzerinden)". Arşivlenen orijinal 2008-01-18 tarihinde.
  2. ^ Microsoft Corp. (2009-11-12). "Yapılandırılmış İstisna İşleme İşlevleri". MSDN Kitaplığı. Alındı 2009-11-17.
  3. ^ Peter Kleissner (14 Şubat 2009). "Windows Özel Durum İşleme - Peter Kleissner". Arşivlenen orijinal 14 Ekim 2013. Alındı 2009-11-21., Derleyici tabanlı Yapısal Özel Durum İşleme Bölüm
  4. ^ "Olağanüstü Davranış - x64 Yapılandırılmış İstisna İşleme". NT Insider.
  5. ^ "x64 istisna işleme". VC ++ 2019 belgeleri.
  6. ^ "MSVC uyumluluğu". Clang 11 belgeleri.
  7. ^ a b "Başlık Altında: Windows XP'de Yeni Vektörlü Özel Durum İşleme". Arşivlenen orijinal 2008-09-15 tarihinde.
  8. ^ "Windows Server 2003 Geliştirilmiş Sistem Bilgileri, Yeni Çekirdek, Hata Ayıklama, Güvenlik ve UI API'lerini Keşfedin". Arşivlenen orijinal 2008-05-05 tarihinde.

Dış bağlantılar