سؤال

لدي تطبيق وحدة تحكم مكتوب بلغة Free Pascal، والذي يتعطل أحيانًا مثل معظم التطبيقات الأكبر حجمًا.نظرًا لأن هذا التطبيق موجود، عادةً ما أطلب من الأشخاص أن يكتبوا لي تتبع المكدس عند التعطل - أقوم بتوزيعه مع كل من تصحيح الأخطاء ومعلومات الخط.ومع ذلك، يستخدم التطبيق إخراج FPC video.pas، وفي بعض الأحيان لا يكون تتبع المكدس لإخراج النص مرئيًا.

هل هناك طريقة لاعتراض النص المكتوب على الاستثناءات غير المعالجة باستخدام تتبع المكدس، حتى أتمكن من كتابته في الملف؟لا يمكنني فقط توجيه الخطأ القياسي إلى ملف ما، لأن فيديو FPC لا يعمل بطريقة ما مع ذلك، وأود أيضًا أن يقوم الأشخاص بتشغيل الملف القابل للتنفيذ وليس ملف دفعي أو ملف shell.

على سبيل المثال، أود التقاط هذا إلى ملف أو مصدر إخراج آخر:

ERangeError : Range check error∙
  $0048C0EA  TCELLS__GETCELL,  line 104 of dfmap.pas
  $004AD133  TDOOMGENERATOR__GENERATECITYDUNGEON,  line 397 of dfdungen.pas
  $004AF87D  TDOOMGENERATOR__GENERATE,  line 760 of dfdungen.pas
  $0041293B  TDOOM__RUN,  line 354 of doombase.pas
  $00401CD6  main,  line 51 of doomrl.pas

هل هناك إمكانية للقيام بذلك بشكل نظيف؟

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

المحلول

هناك نوعان من متغيرات الإجراء (وحدة النظام):

  • باستثناءبروك الذي يعالج الاستثناء
  • و com.backtracestrfunc الذي يعالج العنوان لاسترجاع معلومات الخط.

معالجة irc الحالية ذات طبقات

  • تنتهي وحدة النظام فقط بخطأ ولكنها تحدد متغيرات الإجراء المذكورة أعلاه لتجاوز هذا.
  • تقوم وحدة sysutils بتحويل RTEs إلى استثناء لغة وتجاوزها باستثناءproc باستخدام معالج استثناء اللغة الافتراضي (sysutils.catchunhandledexception)
  • تتجاوز وحدات lineinfo (للطعنات) أو وحدات linfodward (dwarf, 2.4.0+) com.backtracestrfunc متغير الإجراء لتوفير معلومات الخط.

لذلك باختصار:

  • انسخ روتين sysutils.catchunhandledexception إلى التعليمات البرمجية الخاصة بك.
  • فقط قم بتعديل الطريقة التي يتم بها إخراج النسخة بالطريقة التي تريدها، واجعلها صلبة جدًا (نظرًا لأن الاستثناءات أثناء الاستثناءات تكون مربكة ومزعجة)
  • قم بتعيين وظيفة النسخة إلى Exceptproc

لاحظ أنه يتم تضمين وحدة lineinfo ضمنيًا عند القيام بـ -gl

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