التقاط تتبع المكدس في Free Pascal
-
20-09-2019 - |
سؤال
لدي تطبيق وحدة تحكم مكتوب بلغة 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