كيف تقوم دول مجلس التعاون الخليجي بتنفيذ عملية فك المكدس لاستثناءات C++ على نظام التشغيل Linux؟

StackOverflow https://stackoverflow.com/questions/87220

  •  01-07-2019
  •  | 
  •  

سؤال

كيف تقوم دول مجلس التعاون الخليجي بتنفيذ عملية فك المكدس لاستثناءات C++ على نظام التشغيل Linux؟على وجه الخصوص، كيف يمكن معرفة أي من أدوات التدمير التي يجب الاتصال بها عند فتح الإطار (أي نوع المعلومات المخزنة وأين يتم تخزينها)؟

هل كانت مفيدة؟

المحلول

انظر القسم 6.2 من x86_64 أبي.يعرض هذا تفاصيل الواجهة ولكن ليس الكثير من البيانات الأساسية.وهذا أيضًا مستقل عن C++ ويمكن استخدامه لأغراض أخرى أيضًا.

يوجد في المقام الأول قسمان من ثنائي ELF المنبعث من gcc وهما مهمان لمعالجة الاستثناءات.هم .eh_frame و .gcc_except_table.

.eh_frame يتبع تنسيق DWARF (تنسيق تصحيح الأخطاء الذي يتم تشغيله بشكل أساسي عند استخدام gdb).لديها نفس التنسيق تمامًا مثل .debug_frame القسم المنبعث عند الترجمة مع -g.بشكل أساسي، فهو يحتوي على المعلومات اللازمة للعودة إلى حالة سجلات الجهاز والمكدس عند أي نقطة أعلى مكدس الاستدعاءات.راجع معيار Dwarf على dwarfstd.org لمزيد من المعلومات حول هذا الموضوع.

.gcc_except_table يحتوي على معلومات حول الاستثناء الذي يعالج "منصات الهبوط" مواقع المعالجات.يعد ذلك ضروريًا لمعرفة متى تتوقف عن الاسترخاء.لسوء الحظ، لم يتم توثيق هذا القسم بشكل جيد.المقتطفات الوحيدة من المعلومات التي تمكنت من الحصول عليها تأتي من القائمة البريدية لدول مجلس التعاون الخليجي.انظر بشكل خاص هذا المشنور

الجزء المتبقي من المعلومات هو الكود الفعلي الذي يفسر المعلومات الموجودة في أقسام البيانات هذه.الكود ذو الصلة موجود في libstdc++ و libgcc.لا أستطيع أن أتذكر في هذه اللحظة أي القطع تعيش فيها.يمكن العثور على المترجم لمعلومات إطار استدعاء DWARF في كود مصدر gcc في الملف gcc/unwind-dw.c

نصائح أخرى

لا يوجد الكثير من الوثائق المتاحة حاليًا، ولكن النظام الأساسي هو أن دول مجلس التعاون الخليجي تترجم كتل المحاولة/الالتقاط إلى استدعاءات الوظائف وثم الروابط في المكتبة مع دعم وقت التشغيل المطلوب (وثائق حول كود بناء الشجرة يتضمن عبارة "طرح الاستثناء لا يتم تمثيله بشكل مباشر في GIMPLE، حيث يتم تنفيذه عن طريق استدعاء دالة").

لسوء الحظ، لست على دراية بهذه الوظائف ولا أستطيع أن أخبرك بما يجب أن تنظر إليه (بخلاف مصدر libgcc - والذي يتضمن وقت تشغيل معالجة الاستثناء).

هناك "التعامل مع الاستثناءات للمبتدئين"الوثيقة متاحة

على الرغم من أن هذا يبدو خاصًا بـ Itanium، فمن المفترض أن يكون التنفيذ مشابهًا لـ x86: معالجة الاستثناءات ABI

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top