قزم

DWARF هو تنسيق بيانات تصحيح أخطاء معياري واسع الانتشار . صُمم DWARF في الأصل بالتزامن مع تنسيق الملفات التنفيذية والربطية (ELF)، على الرغم من أنه مستقل عن تنسيقات ملفات الكائنات . [ 1 ] الاسم مكمل خيالي من العصور الوسطى لـ "ELF" وليس له معنى رسمي، على الرغم من أن اسم "Debugging With Arbitrary Record Formats" قد اقتُرح لاحقًا كاختصار عكسي . [ 1 ]

نشأت صيغة DWARF مع مُصرّف لغة C ومُصحّح الأخطاء sdb في نظام Unix System V الإصدار 4 (SVR4). [ 1 ] تُصدر معلومات تصحيح الأخطاء، مثل تلك الموجودة بصيغة DWARF، عند -gاستخدام خيار المُصرّف. [ 2 ]

تاريخ

أثبتت النسخة الأولى من DWARF استهلاكها المفرط لمساحة التخزين، فحلّت محلها نسخة لاحقة غير متوافقة، هي DWARF-2، والتي أضافت أنظمة ترميز متنوعة لتقليل حجم البيانات. لم تحظَ DWARF بقبول عالمي فوري؛ فعلى سبيل المثال، عندما اعتمدت شركة Sun Microsystems نظام ELF كجزء من انتقالها إلى نظام Solaris ، اختارت الاستمرار في استخدام ملفات stabs ، في تضمين يُعرف باسم "stabs-in-elf". وحذت شركة Linux حذوها، ولم يصبح DWARF-2 النظام الافتراضي إلا في أواخر التسعينيات.

أصدرت مجموعة عمل DWARF التابعة لمجموعة المعايير الحرة الإصدار 3 من DWARF في يناير 2006، [ 3 ] مضيفة (من بين أمور أخرى) دعم مساحات أسماء C++ ، وبيانات Fortran 90 القابلة للتخصيص ، وتقنيات تحسين المترجم الإضافية .

نشرت لجنة DWARF الإصدار 4 من DWARF، والذي يقدم "ضغط بيانات محسّن، ووصفًا أفضل للتعليمات البرمجية المحسّنة، ودعمًا لميزات اللغة الجديدة في C++"، في عام 2010. [ 4 ]

تم نشر الإصدار الخامس من تنسيق DWARF في فبراير 2017. [ 5 ] [ 6 ] وهو "يتضمن تحسينات في العديد من المجالات: ضغط بيانات أفضل، وفصل بيانات تصحيح الأخطاء عن الملفات القابلة للتنفيذ، ووصف محسّن لوحدات الماكرو وملفات المصدر، وبحث أسرع عن الرموز، وتحسين تصحيح الأخطاء للتعليمات البرمجية المحسّنة، بالإضافة إلى العديد من التحسينات في الوظائف والأداء".

بناء

في ملفات الكائنات (بما في ذلك الملفات التنفيذية)، يتم تخزين DWARF على شكل عدد من الأقسام المسماة .debug_info و .debug_frame وما إلى ذلك، ولكل منها غرض مختلف. [ 7 ]

قائمة الأقسام الرئيسية في DWARF
اسموصف
.debug_infoالقسم الأساسي. [ 8 ]
.debug_typesيحتوي على الأنواع غير التافهة. يتم تخزينه كهيكل تجزئة بحيث يمكن إزالة تعريفات الأنواع المكررة بسهولة.
.debug_abbrevقم بتوفير تعريفات لرموز الاختصار المستخدمة في قسمي .debug_info و .debug_types - وهو شكل بسيط من أشكال ضغط البيانات.
.debug_strيحتوي على سلاسل نصية غير موجودة في قسمي .debug_info و .debug_types. يقوم الرابط بدمج جداول السلاسل النصية لإزالة التكرارات.
.debug_frameمعلومات إطار الاستدعاء ، تسمح للمصححين بتحديد موقع الإطارات على مكدس الاستدعاء .
.debug_locتحتوي على قوائم من تعبيرات DWARF التي تصف للمصحح موقع متغير بناءً على قيمة PC.
.debug_lineيتضمن وصفًا لعملية الربط بين قيم عداد البرنامج (PC) / عناوين التعليمات البرمجية ومواقع المصدر. كما يحدد التعليمات التي تُعد جزءًا من مقدمات وخواتيم الدوال.
.debug_macinfoمعلومات الماكرو
.debug_pubnamesهو فهرس للمساعدة في جلب معلومات تصحيح الأخطاء للرموز دون الحاجة إلى فحص ملفات الكائنات.
.debug_pubtypesهو فهرس للمساعدة في جلب معلومات من نوع معين.

يستخدم DWARF بنية بيانات تُسمى مدخل معلومات التصحيح (DIE) لتمثيل كل متغير ونوع وإجراء، إلخ. يحتوي مدخل معلومات التصحيح على وسم (مثل DW_TAG_variable ، DW_TAG_pointer_type ، DW_TAG_subprogram ) وسمات (أزواج مفتاح-قيمة). يمكن أن يحتوي مدخل معلومات التصحيح على مداخل معلومات تصحيح فرعية متداخلة، مُشكلةً بنية شجرية . يمكن لسمة مدخل معلومات التصحيح أن تُشير إلى مدخل معلومات تصحيح آخر في أي مكان في الشجرة - على سبيل المثال، مدخل معلومات التصحيح الذي يُمثل متغيرًا سيحتوي على مدخل DW_AT_type يُشير إلى مدخل معلومات التصحيح الذي يصف نوع المتغير؛ وهذا مرجع "محلي". يسمح مدخل معلومات التصحيح أيضًا بالإشارة إلى أي مدخل DWARF آخر (حتى لو كان في قسم .debug_info مختلف )، أو الإشارة إلى مدخل في الكتلة المشتركة بالاسم.

تتضمن DWARF ترميزًا للتعبيرات الحسابية العشوائية، وهو عبارة عن بايت كود خاص بآلة مكدس تعبيرات DWARF . يُستخدم هذا التعبير عادةً لوصف موقع كائن ثابت في الذاكرة . أما الطريقة الأخرى لوصف الموقع فهي استخدام قائمة مواقع ، وهي مخصصة بشكل أساسي للكائنات ذات العناوين المتغيرة (مثل تلك التي يتم تخصيصها ديناميكيًا). [ 9 ]DW_AT_location.debug_loclist

.debug_lineتحتوي (و .debug_line_str) على معلومات أرقام الأسطر، وهي معلومات زائدة عن الحاجة، ومع ذلك يصعب ضغطها بالطرق التقليدية. تعالج DWARF هذه المشكلة بتعريف تنسيق بايت كود آخر يُعرّف آلة حالة محدودة بسيطة ومخصصة . عند تشغيل آلة الحالة المحدودة المضمنة في برنامج أرقام الأسطر هذا ، فإنها تُنتج جدول أرقام الأسطر الكامل. [ 10 ]

يعود جزء كبير من الحجم الزائد في DWARF إلى المعلومات المكررة، مثلاً من تضمين العديد من ملفات الرأس المعقدة في لغتي C وC++. ينبغي على كاتب DWARF الحرص على استخدام إمكانيات الإشارة المرجعية في DIE، مثلاً عن طريق تنظيم التعليمات البرمجية في وحدات تجميع، والأنواع في وحدات أنواع يسهل إزالة التكرار منها والإشارة إليها. قد يكون من المناسب أيضاً تخصيص وحدة مستقلة لكل ملف رأس. [ 11 ]

التبني

قزم

في صيغة ELF ، تُخزَّن بيانات DWARF بشكل أساسي بأسماء الأقسام القياسية التي تبدأ بـ `.` .debugفي نفس ملف الكود القابل للتنفيذ .text. يُمكن بدلاً من ذلك إنشاء ملف ELF منفصل خالٍ من الكود، يحتوي فقط على معلومات التصحيح ("الرموز")، بحيث يُمكن تثبيت بيانات DWARF وتحميلها عند الحاجة فقط. [ 12 ] يُعدّ برنامج debuginfod أداةً لاسترجاع الأقسام المخزنة في ملفات منفصلة. [ 13 ]

إضافةً إلى التخزين البسيط كأقسام ELF، تدعم العديد من الأدوات أيضًا صيغةً أخرى يتم فيها ضغط أقسام DWARF، حيث تُفكّ ضغط الأقسام عند الحاجة. في نمط GNU القديم، تُعاد تسمية جميع الأقسام من "debug" إلى "zdebug"؛ ويحتوي القسم على ترويسة تصف طريقة الضغط (عادةً zlib) والحجم الأصلي. أما نمط gABI القياسي الجديد، فيضيف علامةً ELF_COMPRESSEDإلى علامات القسم، مما يسمح لمعظم أقسام ELF باستخدام هذه الميزة. [ 14 ] على الرغم من أنظمة التشفير الذكية المُدمجة في DWARF، تظل بيانات DWARF قابلةً للضغط بدرجة عالية. [ 15 ]

يعتمد دعم إصدار DWARF على تركيبة المترجم والمصحح، ولكن في معظم الحالات يتم استخدام DWARF 5.

ماخ-أو

يدعم تنسيق Mach-O المستخدم في نظام macOS تنسيقي stabs وDWARF. ولا يزال تنسيق stabs، الذي يُضمّن معلومات تصحيح الأخطاء مباشرةً في جدول الرموز LC_SYMTAB، يُستخدم بكثرة في بيئات التطوير حيث يُخزّن مباشرةً مع الكود. مع أنه من الممكن تقنيًا تخزين بيانات DWARF مع الكود، إلا أن أدوات النظام تتوقع عمومًا توفير بيانات تصحيح الأخطاء في ملفات كائن "dSYM" منفصلة وخالية من الكود. [ 16 ] تحتوي هذه الملفات فقط على مقطع "__DWARF"، والذي يتضمن أقسامًا تحمل أسماءً مثل "__debug_info" وما شابه، وهي أقسام تُطابق أقسام DWARF القياسية. [ 17 ]

إصدار DWARF هو 4 أو 5، حسب إصدار نظام التشغيل. لا تستخدم الأدوات الرسمية معلومات التصحيح المضغوطة ولا تفهمها.

أدوات

Libdwarf هي مكتبة توفر الوصول إلى معلومات تصحيح الأخطاء DWARF في الملفات التنفيذية وملفات الكائنات. [ 18 ]

يحتوي elfutils على أدوات لمعالجة أقسام ELF، على سبيل المثال لدمج معلومات التصحيح في ملف أو لفصلها إلى ملف مختلف.

للمزيد من القراءة

كتب مايكل إيجر، رئيس لجنة معايير DWARF، مقدمة عن تنسيقات تصحيح الأخطاء وDWARF 3، مقدمة إلى تنسيق تصحيح الأخطاء DWARF . [ 1 ]

مراجع

  1. 1 2 3 4 مايكل ج. إيجر (أبريل 2012). "مقدمة إلى تنسيق تصحيح الأخطاء DWARF" (ملف PDF) . تم الاطلاع عليه بتاريخ 8 يناير 2015 .
  2. "خيارات تصحيح الأخطاء (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org .
  3. «إصدار معيار DWARF الإصدار 3» (بيان صحفي). مجموعة المعايير الحرة. 4 يناير 2006. مؤرشف من الأصل في 25 يوليو 2011. تم الاطلاع عليه في 25 يونيو 2007 .
  4. "إصدار DWARF الرابع" . لجنة DWARF. ١٦ يونيو ٢٠١٠. مؤرشف من الأصل في ٣٠ يوليو ٢٠٢٠. تم الاطلاع عليه في ٢٤ يونيو ٢٠١٠ .
  5. "إصدار DWARF القياسي الخامس" . لجنة DWARF. 15 فبراير 2017. تاريخ الاسترجاع: 7 أغسطس 2017 .
  6. "معيار DWARF 5" . لجنة DWARF. 15 فبراير 2017. تم الاطلاع عليه بتاريخ 7 أغسطس 2017 .
  7. "استكشاف معلومات تنسيق تصحيح الأخطاء DWARF" .
  8. يو، إلسون؛ يون، تايك يونغ (2023-02-03). تطبيقات أمن المعلومات: المؤتمر الدولي الثالث والعشرون، WISA 2022، جزيرة جيجو، كوريا الجنوبية، 24-26 أغسطس 2022، أوراق مختارة منقحة . سبرينغر نيتشر. ISBN 978-3-031-25659-2.
  9. DWARF الإصدار 5، القسم 2.6
  10. DWARF الإصدار 5، القسم 6.2
  11. DWARF الإصدار 5، القسم 2.6
  12. "امتدادات الأقزام" . gcc.gnu.org .
  13. "استرجاع أقسام ملف ELF باستخدام debuginfod" . www.redhat.com . تاريخ الاسترجاع: 25-09-2023 .
  14. بهرامي، علي. "ضغط قسم ELF | سولاريس" . blogs.oracle.com .
  15. "أقسام تصحيح الأخطاء المضغوطة" . ماسك راي . 23 يناير 2022.
  16. ستيل، أيدان (8 يوليو 2026). "aidansteele/osx-abi-macho-file-format-reference" .
  17. " فهم معلومات تصحيح أخطاء أبل - كيث سمايلي" . www.smileykeith.com
  18. "libdwarf: واجهة مكتبة المستهلك لـ DWARF" . www.prevanders.net . تم الاطلاع عليه بتاريخ 2023-12-06 .