2009-11-23 13 views
6

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

समस्या यह है कि, मुझे अभी तक इस चीज़ को डीबग करने का कोई तरीका नहीं मिला है। ज़ोप लॉग में कुछ भी नहीं है और सिस्टम लॉग में कुछ भी नहीं है। मैंने स्टैकट्रैक प्राप्त करने के लिए this question से सुझावों का प्रयास किया, लेकिन एकमात्र सिग्नल जिसका कोई प्रभाव है SIGKILL है।

क्या यह पता लगाने की एक और संभावना है कि यह कहां फंस जाता है जब प्रक्रिया ठीक होती है?

उत्तर

0

यदि प्रक्रिया किसी अन्य सिग्नल के माध्यम से फंस जाती है, तो आप रनटाइम पर इसे संलग्न करने की कोशिश करने के बजाय इसे डीबगर से चलाने पर विचार करना चाहेंगे।

इसके अलावा, यह अन्य डीबगिंग रणनीति के लिए उपयोगी हो सकता है, जैसे कि कोड के कुछ हिस्सों को बंद करना, कम से कम मामला पता लगाने के लिए जिसमें यह अभी भी पुन: उत्पन्न होता है ताकि यह देखने के लिए कि यह बेहतर क्यों होता है।

1

आप चल रहे प्रक्रिया में डीबगर संलग्न करने का प्रयास कर सकते हैं। this question भी देखें।

2

this SO question पर मेरा उत्तर देखें, Products.signalstack का उपयोग करें। यह उत्पाद पंजीकरण समय पर, उसी हैंडलर को आपके द्वारा पहले से मिले उत्तर के रूप में पंजीकृत करता है। शायद यह आपके लिए बेहतर काम करता है।

यदि नहीं, तो आपके पास शायद आपके हाथों में ओएस-स्तर I/O समस्या हो, और आपकी एकमात्र आशा प्रक्रिया में जीडीबी संलग्न कर रही है। जीडीबी उत्तरों के लिए स्टैक ओवरफ़्लो खोजें; यहां जानकारी की एक संपत्ति है!

+1

+1 इसके अलावा ** pstack ** और ** lsstack ** कुछ उपयोग का हो सकता है। –

0

कुछ समय के लिए सर्कल में इंटरनेट के चारों ओर दौड़ने के बाद मैं अंततः यहां समाप्त हुआ: http://podoliaka.org/2016/04/10/debugging-cpython-gdb/ - विस्तार से वर्णन करता है कि सभी टुकड़े एक साथ कैसे फिट होते हैं। मेरे लिए पैसा उद्धरण 'gdb /usr/bin/python -p $ PID' - डीडीबी को सही डीबग जानकारी फ़ाइलों को खोजने के लिए निष्पादन योग्य का नाम आवश्यक है।

2

आप pyrasite का उपयोग करके एक अच्छा स्टैक ट्रेस प्रिंट कर सकते हैं।

सबसे पहले, आपको gdb इंस्टॉल करना होगा।

# Redhat, CentOS, etc 
$ yum install gdb 

# Ubuntu, Debian, etc 
$ apt-get update && apt-get install gdb 

फिर, पाइरासाइट स्थापित करें।

$ pip install pyrasite 

उपयोग ps या किसी अन्य विधि अटक अजगर प्रक्रिया के लिए प्रक्रिया ID खोजने के लिए और इसके साथ pyrasite-shell चलाने के लिए।

# Assuming process ID is 12345 
$ pyrasite-shell 12345 

अब आपको एक अजगर आरईपीएल देखना चाहिए। सभी धागे के लिए स्टैक निशान देखने के लिए आरईपीएल में निम्नलिखित चलाएं।

import sys, traceback 
for thread_id, frame in sys._current_frames().items(): 
    print 'Stack for thread {}'.format(thread_id) 
    traceback.print_stack(frame) 
    print '' 
संबंधित मुद्दे