كيف يمكنني تفريغ عملية بايثون بأكملها لفحص تصحيح الأخطاء لاحقًا؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لدي تطبيق بايثون في حالة غريبة.لا أريد إجراء تصحيح مباشر للعملية.هل يمكنني تفريغه في ملف وفحص حالته لاحقًا؟أعلم أنني قمت باستعادة الملفات الأساسية لبرامج C في gdb لاحقًا، لكنني لا أعرف كيفية فحص تطبيق Python بطريقة مفيدة من gdb.

(هذا اختلاف في سؤالي حول تصحيح أخطاء memleaks في نظام الإنتاج.)

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

المحلول

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

أما بالنسبة للتعامل مع الملف الأساسي لعملية بايثون، فإن ملف يحتوي مصدر بايثون على ملف gdbinit الذي يحتوي على وحدات ماكرو مفيدة.لا يزال الأمر أكثر إيلامًا من الدخول في العملية نفسها بطريقة أو بأخرى (باستخدام pdb أو المترجم التفاعلي) ولكنه يجعل الحياة أسهل قليلاً.

نصائح أخرى

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

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

وبعد إجراء بعض الأبحاث، تبين أن الكود ذي الصلة يأتي بالفعل من Paste's وحدة EvalException.يجب أن تكون قادرًا على النظر هناك لمعرفة ما تحتاجه.

هذه الإجابة يقترح إنشاء تفريغ أساسي لبرنامجك ثم مواصلة التنفيذ على صندوق آخر مشابه بدرجة كافية.

من الممكن أيضًا أن تكتب شيئًا من شأنه أن يتخلص من كل شيء بيانات من العملية، على سبيل المثال.

  • المخلل الذي يتجاهل الكائنات التي لا يمكنه اختيارها (استبدالها بشيء آخر) (على سبيل المثال. بايثون:تخليل الإملاء مع بعض العناصر التي لا يمكن اختيارها)
  • الطريقة التي تحول كل شيء بشكل متكرر إلى أشياء قابلة للتسلسل (على سبيل المثال. هذا, ، إلا أنه يحتاج إلى التحقق من الكائنات المتكررة بشكل لا نهائي والقيام بشيء بها؛كما يمكن أن تحاول dir() و getattr() لمعالجة بعض الكائنات غير المعروفة، على سبيل المثال.فئات التمديد).

لكن ترك عملية جارية مع فتحة تفتيش أو أبراج أو شيء من هذا القبيل يبدو بالتأكيد أكثر ملاءمة عندما يكون ذلك ممكنًا.

(أيضًا، أتساءل عما إذا كان قد تم كتابة شيء أكثر ملاءمة منذ طرح هذا السؤال لأول مرة)

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