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

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

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول تصحيح حالة الجمود في تطبيق Python متعدد الخيوط بعد إغلاقه.هل هناك طريقة لإرفاق مصحح أخطاء لفحص حالة العملية؟

يحرر:أحاول ذلك على نظام التشغيل Linux، ولكن سيكون أمرًا رائعًا لو كان هناك حل مشترك بين الأنظمة الأساسية.إنها بايثون بعد كل شيء :)

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

المحلول

نعم، gdb جيد لتصحيح الأخطاء على المستوى الأدنى.

يمكنك تغيير المواضيع مع خيط يأمر.

على سبيل المثال

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

يمكنك أيضًا التحقق من مصححات الأخطاء الخاصة بـ Python مثل Winpdb, ، أو pydb.كلا النظامين مستقلان.

نصائح أخرى

يستخدم Winpdb.إنها منصة مستقلة مصحح أخطاء GPL Python الرسومي مع دعم تصحيح الأخطاء عن بعد عبر الشبكة، وخيوط متعددة، وتعديل مساحة الاسم، وتصحيح الأخطاء المضمن، والاتصال المشفر، وهو أسرع بما يصل إلى 20 مرة من pdb.

سمات:

  • ترخيص جي بي إل.Winpdb هو برنامج مجاني.
  • متوافق مع CPython 2.3 إلى 2.6 وPython 3000
  • متوافق مع wxPython 2.6 إلى 2.8
  • منصة مستقلة، وتم اختبارها على Ubuntu Gutsy وWindows XP.
  • واجهات المستخدم:يعتمد rpdb2 على وحدة التحكم، بينما يتطلب winpdb إصدار wxPython 2.6 أو إصدار أحدث.

Screenshot
(مصدر: winpdb.org)

يمكنك إرفاق مصحح أخطاء بعملية Python متعددة الخيوط، لكن عليك القيام بذلك على المستوى C.لفهم ما يحدث، تحتاج إلى تجميع مترجم بايثون باستخدام الرموز.إذا لم يكن لديك واحدًا، فستحتاج إلى تنزيل المصدر من python.org وإنشائه بنفسك:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

تأكد من أن عبء العمل الخاص بك يعمل على هذا الإصدار من المترجم الفوري.يمكنك بعد ذلك إرفاقه بـ GDB في أي وقت.قام فريق Python بتضمين نموذج ".gdbinit" في دليل Misc الخاص بهم، والذي يحتوي على بعض وحدات الماكرو المفيدة.ومع ذلك، فقد تم كسره بسبب تصحيح الأخطاء متعدد الخيوط (!).تحتاج إلى استبدال خطوط مثل هذا

while $pc < Py_Main || $pc > Py_GetArgcArgv

كالآتي:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

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

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

ونرى ما يحدث.نوع من.

يمكنك تحليل الكائنات باستخدام الماكرو "pyo". لدى كريس بعض الأمثلة على مدونته.

حظ سعيد.

(تصفيق ل مدونة دان للحصول على بعض المعلومات الأساسية بالنسبة لي، ولا سيما إصلاح الترابط!)

إذا كنت تقصد pydb، فلا توجد طريقة للقيام بذلك.وكانت هناك بعض الجهود في هذا الاتجاه:راجع التزام svn, ، ولكن تم التخلي عنها.من المفترض يدعمه Winpdb.

تجربتي في تصحيح أخطاء البرامج متعددة الخيوط في PyDev (Eclipse على نظام التشغيل Windows XP) هي أنه لا يمكن ربط الخيوط التي تم إنشاؤها باستخدام thread.start_new_thread، ولكن يمكن ربط الخيوط التي تم إنشاؤها باستخدام threading.Thread.نأمل المعلومات المفيدة.

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

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

com.pdbinject يسمح لك بإدخال pdb في عملية بايثون قيد التشغيل بالفعل.

يعمل الملف القابل للتنفيذ pdbinject فقط ضمن python2، ولكن يمكن حقنه في python3 بشكل جيد أيضًا.

بيئة تطوير متكاملة بايشارم يسمح بالإرفاق بعملية Python قيد التشغيل منذ الإصدار 4.0.

هنا يوصف كيفية القيام بذلك.

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