2009-06-23 11 views
26

मैं प्रत्येक के मौजूदा स्टैक समेत सभी सक्रिय धागे की एक सूची डंप करने की कोशिश कर रहा हूं। मैं threading.enumerate() का उपयोग कर सभी धागे की एक सूची प्राप्त कर सकता हूं, लेकिन मैं वहां से ढेर तक पहुंचने का कोई तरीका नहीं समझ सकता।सभी सक्रिय थ्रेडों के डंप स्टैकट्रैस

पृष्ठभूमि: एक ज़ोप/प्लोन ऐप समय-समय पर बाहर निकलता है, सीपीयू का 100% उपभोग करता है और इसे पुनरारंभ करने की आवश्यकता होती है। मुझे लगता है कि यह एक लूप है जो ठीक से समाप्त नहीं होता है, लेकिन मैं इसे सत्यापन के लिए परीक्षण-वातावरण में पुन: उत्पन्न नहीं कर सकता। मैं एक सिग्नल हैंडलर पंजीकृत करने में कामयाब रहा जिसे बाहर से ट्रिगर किया जा सकता है, इसलिए जैसे ही स्थिति फिर से होती है, मैं कुछ कोड ट्रिगर कर सकता हूं। अगर मैं सभी सक्रिय धागे के लिए स्टैकट्रैक डंप कर सकता हूं, तो यह मुझे एक संकेत देगा जो गलत हो जाता है। छेद बात अजगर 2.4 पर चलता है ...

कैसे नीचे इस तरह की स्थितियों का पता लगाने के पर कोई भी विचार की सराहना की कर रहे हैं :)

चीयर्स, Chriss

उत्तर

8

Zope उपयोग करते समय, आप Products.signalstack या mr.freeze स्थापित करना चाहते हैं; ये सिर्फ इस उद्देश्य के लिए डिजाइन किए गए थे!

अपने ज़ोप सर्वर पर यूएसआर 1 सिग्नल भेजें और यह कंसोल पर सभी धागे के लिए तुरंत स्टैक निशान डंप करेगा। यह तब भी करेगा जब सभी ज़ोप थ्रेड लॉक हो जाएं।

हुड के तहत ये पैकेज अप्रत्यक्ष रूप से threadframes का उपयोग करते हैं; पाइथन संस्करण 2.5 और ऊपर के लिए, जब ज़ोपे का उपयोग करके नहीं है, तो आप प्रति-थ्रेड स्टैक फ्रेम तक पहुंचने के लिए sys._current_frames() फ़ंक्शन का उपयोग करके समान कार्यक्षमता बना सकते हैं।

Zope 2.12.5 के रूप में यह कार्यक्षमता ज़ोप में ही एकीकृत है, और अब अतिरिक्त पैकेज स्थापित करने की आवश्यकता नहीं है।

+0

बहुत बहुत धन्यवाद, यह वही है जो मुझे चाहिए! – Chriss

+0

आजकल प्लोन में "कोई विशेष पैकेज आवश्यक नहीं है" http: // stackoverflow।कॉम/ए/36633215/3046069 – Danimal

+0

@ डेनिमल: धन्यवाद, पोस्ट में जोड़ा गया। इस जवाब को लिखने के एक साल बाद 2.12.5 जारी किया गया था। –

0

ASPN पर किसी लागू नुस्खा नहीं है। आप सभी tids प्राप्त करने के लिए threading.enumerate() का उपयोग कर सकते हैं, फिर केवल एक स्टैक ट्रेस को मजबूर करने के लिए कुछ उपयुक्त अपवाद के साथ _async_raise() पर कॉल करें।

35

जैसा कि पहले के उत्तर में जिटर इंगित करता है sys._current_frames() आपको v2.5 + के लिए क्या चाहिए। अजगर 3.3 के लिए

print >> sys.stderr, "\n*** STACKTRACE - START ***\n" 
code = [] 
for threadId, stack in sys._current_frames().items(): 
    code.append("\n# ThreadID: %s" % threadId) 
    for filename, lineno, name, line in traceback.extract_stack(stack): 
     code.append('File: "%s", line %d, in %s' % (filename, 
                lineno, name)) 
     if line: 
      code.append(" %s" % (line.strip())) 

for line in code: 
    print >> sys.stderr, line 
print >> sys.stderr, "\n*** STACKTRACE - END ***\n" 
13

और बाद में, वहाँ faulthandler.dump_traceback() है: आलसी के लिए निम्नलिखित कोड का टुकड़ा मेरे लिए काम किया है और आपकी मदद कर सकता है।

नीचे दिया गया कोड इसी तरह के आउटपुट का उत्पादन करता है, लेकिन धागा नाम शामिल करता है और अधिक जानकारी मुद्रित करने के लिए बढ़ाया जा सकता है।

for th in threading.enumerate(): 
    print(th) 
    traceback.print_stack(sys._current_frames()[th.ident]) 
    print() 
1
बस पूर्णता खातिर

, Products.LongRequestLogger बाधाओं की पहचान के लिए, और यह विशिष्ट अंतराल पर stacktraces उदासीनता ऐसा करने के लिए सुपर उपयोगी है।