آليات معالجة الاستثناءات الخاصة بمايكروسوفت

تستخدم عائلة أنظمة التشغيل مايكروسوفت ويندوز بعض آليات معالجة الاستثناءات المحددة.

معالجة الاستثناءات المنظمة

تُعدّ معالجة الاستثناءات المهيكلة من مايكروسوفت آلية معالجة الاستثناءات الأصلية لنظام ويندوز، وهي تقنية رائدة لمعالجة الاستثناءات المتجهة (VEH). [ 1 ] وتتميز بآلية finallyغير موجودة في استثناءات لغة C++ القياسية (لكنها موجودة في معظم لغات البرمجة الإجرائية التي ظهرت لاحقًا). يتم إعداد معالجة الاستثناءات المهيكلة ومعالجتها بشكل منفصل لكل سلسلة تنفيذ .

الاستخدام

تدعم مايكروسوفت معالجة الاستثناءات المُدارة (SEH) كتقنية برمجة على مستوى المُصرّف فقط. يحتوي مُصرّف MS Visual C++ على ثلاث كلمات مفتاحية غير قياسية لهذا الغرض: __tryو __exceptو __finally. أما جوانب معالجة الاستثناءات الأخرى فتُدعم بواسطة عدد من وظائف واجهة برمجة تطبيقات Win32 ، [ 2 ] على سبيل المثال، RaiseExceptionلرفع استثناءات SEH يدويًا.

int filterExpression ( EXCEPTION_POINTERS * ep ) { ep -> ContextRecord -> Eip += 8 ; // قد يتم ترميز تعليمة القسمة من 2 إلى 8 بايت return EXCEPTION_CONTINUE_EXECUTION ; }int main ( void ) { static int zero = 0 ; __try { zero = 1 / zero ; asm { nop nop nop nop nop nop nop } printf ( "تجاوز الاستثناء. \n " ); } __except ( filterExpression ( GetExceptionInformation ())) { printf ( "تم استدعاء المعالج. \n " ); } return 0 ; }

تطبيق

IA-32

يحتوي كل خيط تنفيذ في إصدار Windows IA-32 أو طبقة محاكاة WoW64 لإصدار x86-64 على رابط لقائمة _EXCEPTION_REGISTRATION_RECORD غير موثقة في بداية كتلة معلومات الخيط . يستدعي هذا البيان أساسًا دالة معرفة من قِبل المُصرّف . تُخصّص هذه الدالة سجل _EXCEPTION_REGISTRATION_RECORD على المكدس، مُشيرةً إلى الدالة [ أ ] في [ ب ثم تُضيف السجل إلى رأس القائمة. في نهاية الكتلة، يتم استدعاء دالة معرفة من قِبل المُصرّف تُنفّذ العملية العكسية. يمكن تضمين أي من هذه الإجراءات المعرفة من قِبل المُصرّف . يتم استدعاء جميع الكتل المعرفة من قِبل المُبرمج من داخل [ب]. إذا كانت الكتل المعرفة من قِبل المُبرمج موجودة، يتم توسيع سجل _EXCEPTION_REGISTRATION_RECORD الذي تم إنشاؤه بواسطة [ب ] ببعض الحقول الإضافية التي تستخدمها [ج] . [ 3 ]__tryEH_prolog__except_handler3msvcrt.dll__tryEH_epilog__except__finally__except_handler3EH_prolog__except_handler3

في حالة حدوث استثناء في كود وضع المستخدم ، يقوم نظام التشغيل [ ج ] بتحليل قائمة _EXCEPTION_REGISTRATION_RECORD الخاصة بالخيط ، ويستدعي كل معالج استثناء بالتسلسل حتى يُشير أحد المعالجات إلى أنه قد عالج الاستثناء (عن طريق قيمة الإرجاع ) أو حتى يتم استنفاد القائمة. آخر معالج في القائمة هو الذي يعرض دائمًا رسالة خطأ " خطأ الحماية العامة" . [ د ] ثم يتم اجتياز القائمة مرة أخرى لإتاحة الفرصة للمعالجات لتنظيف أي موارد مستخدمة. أخيرًا، يعود التنفيذ إلى وضع النواة [ هـ ] حيث يتم إما استئناف العملية أو إنهاؤها.kernel32!UnhandledExceptionFilter

انتهت صلاحية براءة الاختراع الخاصة بهذا النمط من SEH، US5628016، في عام 2014.

x86-64

لا تتضمن معالجة الاستثناءات المتزامنة (SEH) في أنظمة ويندوز 64 بت قائمةً لمعالجات الاستثناءات أثناء التشغيل؛ بل تستخدم جدولًا لفكّ تكديس الاستثناءات ( UNWIND_INFO) يُفسّره النظام عند حدوث استثناء. [ 4 ] [ 5 ] هذا يعني أن المُصرّف ليس مُضطرًا إلى توليد شيفرة إضافية لتنفيذ فكّ تكديس الاستثناءات يدويًا واستدعاء معالجات الاستثناءات بشكل مناسب. كل ما عليه فعله هو إصدار معلومات على شكل جداول فكّ تكديس حول تخطيط إطار المكدس ومعالجات الاستثناءات المُحددة.

يدعم

يدعم GCC 4.8+ من Mingw-w64 استخدام SEH 64-bit لاستثناءات C++. يدعم LLVM clang __tryكلاً من x86 و x64. [ 6 ]

معالجة الاستثناءات الموجهة

تم تقديم معالجة الاستثناءات الموجهة (VEH) في نظام التشغيل ويندوز إكس بي . [ 7 ] تُتاح معالجة الاستثناءات الموجهة لمبرمجي ويندوز الذين يستخدمون لغات برمجة مثل سي++ وفيجوال بيسك . لا تحل VEH محل معالجة الاستثناءات المهيكلة (SEH)؛ بل تتعايش كلتاهما، مع إعطاء الأولوية لمعالجات VEH على معالجات SEH. [ 1 ] [ 7 ] بالمقارنة مع SEH، تعمل VEH بشكل مشابه لإشارات يونكس التي يُرسلها نواة النظام . [ 8 ]

ملحوظات

  1. يختلف الاسم في الإصدارات المختلفة من وقت تشغيل VC
  2. ntdll.dll وkernel32.dll، بالإضافة إلى البرامج الأخرى المرتبطة بشكل ثابت بوقت تشغيل VC، تحتوي على هذه الوظيفة مُضمنة في الكود المُجمّع بدلاً من ذلك.
  3. وبشكل أكثر تحديدًا،ntdll!RtlDispatchExceptionيتم استدعاء روتين النظام منntdll!KiUserExceptionDispatcherوالذي يتم استدعاؤه بدوره منnt!KiDispatchExceptionدالة النواة. (انظر كين جونسون (16 نوفمبر 2007). "كتالوج استدعاءات وضع النواة إلى وضع المستخدم في مكتبة NTDLL، الجزء 2: KiUserExceptionDispatcher") .(للمزيد من التفاصيل)
  4. يمكن كتم الرسالة بتغيير وضع الخطأ الخاص بالعملية؛ ويمكن استبدال معالج الخطأ الأخير الافتراضي بواجهةبرمجة التطبيقات SetUnhandledExceptionFilter.
  5. ntdll!KiUserExceptionDispatcher يدعو إماnt!ZwContinueأوnt!ZwRaiseException

مراجع

  1. 1 2 "معالجة الاستثناءات الموجهة في نظام التشغيل Windows Server 2003 (عبر أرشيف الإنترنت)" . مؤرشف من الأصل بتاريخ 18-01-2008.
  2. شركة مايكروسوفت (12 نوفمبر 2009). "وظائف معالجة الاستثناءات المهيكلة" . مكتبة MSDN . تم الاسترجاع في 23 يوليو 2022 .
  3. بيتر كلايسنر (14 فبراير 2009). "معالجة استثناءات ويندوز - بيتر كلايسنر" . مؤرشف من الأصل في 14 أكتوبر 2013. تم الاطلاع عليه بتاريخ 21 نوفمبر 2009 .قسم معالجة الاستثناءات المهيكلة القائمة على المُصرّف
  4. "السلوك الاستثنائي - معالجة الاستثناءات المهيكلة x64" . مجلة NT Insider.
  5. "معالجة استثناءات x64" . وثائق VC++ 2019. 8 فبراير 2022.
  6. "توافق MSVC" . وثائق Clang 11 .
  7. 1 2 "نظرة معمقة: معالجة الاستثناءات المتجهة الجديدة في ويندوز إكس بي" . مؤرشف من الأصل بتاريخ 15-09-2008.
  8. "Windows Server 2003: اكتشف معلومات النظام المحسّنة، والنواة الجديدة، وتصحيح الأخطاء، والأمان، وواجهات برمجة التطبيقات" . مؤرشف من الأصل بتاريخ 2008-05-05.