2012-12-26 11 views
9

कुछ पृष्ठभूमि:लिनक्स एप्लिकेशन के भीतर नकली जागने को कैसे ट्रिगर करें?

मैं एक आवेदन है कि तीसरे पक्ष के हार्डवेयर और एक बंद स्रोत ड्राइवर पर निर्भर करता है है। ड्राइवर में वर्तमान में एक बग है जो डिवाइस को यादृच्छिक अवधि के बाद प्रतिक्रिया देना बंद कर देता है। यह चालक के भीतर एक स्पष्ट डेडलॉक के कारण होता है और मेरे आवेदन की उचित कार्यप्रणाली में बाधा डालता है, जो हमेशा 24/7 पर दिखाई देने वाले वातावरण में होता है।

जो मैंने पाया है वह है कि प्रक्रिया में जीडीबी संलग्न करना, और डिवाइस को फिर से शुरू करने की प्रक्रिया में प्रक्रिया परिणामों से जीडीबी को अलग करना। यह मेरा पहला संकेत था कि ड्राइवर के भीतर थ्रेड लॉकिंग समस्या थी। कुछ प्रकार की रेस हालत है जो डेडलॉक की ओर ले जाती है। जीडीबी को जोड़ना स्पष्ट रूप से धागे के कुछ पुनर्स्थापन का कारण बन रहा था और शायद उन्हें अपने प्रतीक्षा राज्य से बाहर धकेल रहा था, जिससे उन्हें अपनी परिस्थितियों का फिर से मूल्यांकन करना पड़ा और इस प्रकार डेडलॉक तोड़ना पड़ा।

प्रश्न:

मेरा प्रश्न केवल यह है: वहाँ एक आवेदन के लिए एक साफ इंतजार कार्यक्रम उनके प्रतीक्षा राज्य में दखल देने के भीतर सभी धागे को गति प्रदान करने के लिए है? एक बात है कि निश्चित रूप से काम करता है (कम से कम मेरी कार्यान्वयन पर) किसी अन्य प्रक्रिया से एक SIGSTOP तुरंत बाद भेजने के लिए एक SIGCONT के द्वारा होता है (यानी बैश से):

kill -19 `cat /var/run/mypidfile` ; kill -18 `cat /var/run/mypidfile` 

इस प्रक्रिया को और सब कुछ के भीतर एक नकली वेक-अप से चलाता है जीवन में वापस आता है।

मुझे उम्मीद है कि मेरी प्रक्रिया के भीतर सभी धागे की नकली जागरूकता को ट्रिगर करने के लिए एक बुद्धिमान तरीका है। pthread_cond_broadcast(...) सोचें लेकिन वास्तविक स्थिति चर के उपयोग के बिना प्रतीक्षा की जा रही है।

क्या यह संभव है, या kill जैसे किसी प्रोग्राम पर निर्भर है मेरा एकमात्र दृष्टिकोण?

+2

आपके धागे अवरुद्ध क्या हैं? 'gdb' आपको बता सकता है कि क्या वे उपयोगकर्ता स्थान में अवरुद्ध हैं। 'ps axlm' आपको 'WCHAN' फ़ील्ड में बता सकता है। –

+0

मेरे लिए बिल्कुल कहना मुश्किल है-जो-थ्रेड हैंडलॉक जोड़ी हैं। 'Pthread_cond_wait' में दो धागे हैं जो अपमानजनक थ्रेड के रूप में मेरा सबसे अच्छा अनुमान हैं। मैं गलत हो सकता था। यही कारण है कि मैं हर-धागे को मारने का प्रयास कर रहा हूं। मैं 'ps axlm' से अनजान था और अगली बार जब मैं इस मुद्दे को पकड़ता हूं तो अधिक डेटा इकट्ठा करने के लिए इसका उपयोग करूंगा। यह बेहद छद्म है और दुर्भाग्यवश, कोई प्रजनन कदम नहीं हैं। मैं अपने निष्कर्षों की रिपोर्ट करूंगा। –

+1

आप प्रत्येक धागे के ढेर को पकड़ने के लिए एक स्क्रिप्ट का उपयोग कर सकते हैं। 'gdb -ex "सेट पेजिनेशन 0" -एक्स "थ्रेड सभी बीटी लागू करें" --batch -p $ (pidof EXECUTABLE_NAME) ' –

उत्तर

4

जिस तरह से आप इसे अभी कर रहे हैं वह शायद सबसे सही और सरल है। कर्नेल में "किसी दिए गए प्रक्रिया में सभी प्रतीक्षा फूटक्स" ऑपरेशन नहीं है, जो आपको इसे और अधिक हासिल करने की आवश्यकता होगी।

ध्यान दें कि अगर विफलता से बचने के लिए "डेडलॉक" pthread_cond_wait में है, लेकिन डेडलॉक से सिग्नल ब्रेक के साथ इसे बाधित कर रहा है, तो बग एप्लिकेशन में नहीं हो सकता है; यह वास्तव में pthread स्थिति चर के कार्यान्वयन में होना चाहिए। glibc अपनी स्थिति परिवर्तनीय कार्यान्वयन में unfixed बग ज्ञात है; http://sourceware.org/bugzilla/show_bug.cgi?id=13165 और संबंधित बग रिपोर्ट देखें। हालांकि, आपको एक नया मिल सकता है, क्योंकि मुझे नहीं लगता कि मौजूदा ज्ञात लोगों को सिग्नल के साथ फ्यूटेक्स प्रतीक्षा से बाहर तोड़कर तय किया जा सकता है। यदि आप इस बग को ग्लिबैक बग ट्रैकर पर रिपोर्ट कर सकते हैं, तो यह बहुत उपयोगी होगा।

+0

मैं इसका अन्वेषण करूंगा। धन्यवाद। –

+0

मैं वर्तमान में उपरोक्त प्रश्न पर डेविड की टिप्पणियों के आधार पर अधिक डेटा एकत्र कर रहा हूं। मेरा मानना ​​है कि इससे मुझे इस मुद्दे को बेहतर ढंग से समझने में मदद मिलेगी और क्या एक ग्लिबक बग एक संभावना है। जहां तक ​​मेरा प्रश्न चलता है, मैं यह देखने के लिए कुछ दिनों के लिए इस उत्तर को स्वीकार करने के लिए रोक दूंगा कि किसी और के पास कोई विचार है या नहीं। सिग्नलिंग विधि काम करता है, ऐसा लगता है कि यह बेहतर हो सकता है। आपकी सहायता के लिए धन्यवाद. –

संबंधित मुद्दे