2009-12-23 15 views
5

मुझे पता है कि, पर्याप्त संदर्भ दिया गया है, कोई segfault स्थिति से रचनात्मक रूप से (यानी पुनर्प्राप्ति) का उपयोग करने की उम्मीद कर सकता है।क्या "segfault" को फँसाने का कोई मुद्दा है?

लेकिन, क्या यह प्रयास संभव है? यदि हां, तो किस स्थिति में?

उत्तर

14

आप वास्तव में एक सेगफॉल्ट से पुनर्प्राप्त होने की उम्मीद नहीं कर सकते हैं। आप यह पता लगा सकते हैं कि ऐसा हुआ है, और यदि संभव हो तो प्रासंगिक एप्लिकेशन-विशिष्ट स्थिति को डंप करें, लेकिन आप प्रक्रिया को जारी नहीं रख सकते हैं। ऐसा इसलिए है क्योंकि (दूसरों के बीच)

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

तो छोड़ने की तुलना में अधिक समस्याओं का कारण बनता बाद में डेटा त्रुटियों या आगे बुरा व्यवहार का कारण है, वहाँ यह फँसाने और एक काफी अचानक फैशन में प्रक्रिया समाप्त छोड़कर कुछ भी करने का कोई मतलब नहीं है।डिस्क पर वापस (महत्वपूर्ण) डेटा लिखने का प्रयास करने में कोई बात नहीं है, या अन्य उपयोगी काम करना जारी रखें। लॉग इन करने के लिए राज्य को डंप करने में कुछ बिंदु है- जो कई एप्लिकेशन करते हैं - और फिर छोड़ते हैं।

संभवतः उपयोगी काम करने के लिए आपकी खुद की प्रक्रिया निष्पादित हो सकती है, या एक वॉचडॉग प्रक्रिया है जो क्रैश के मामले में इसे पुनरारंभ करती है। (एनबी: यदि आपकी प्रक्रिया में> 1 थ्रेड है तो निष्पादन में हमेशा परिभाषित व्यवहार नहीं होता है)

+0

+1: अद्भुत जवाब ... बहुत बहुत धन्यवाद। – jldupont

+0

एक अच्छा सारांश है, लेकिन मैं अपने उत्तर में वर्णित कारण के लिए असहमत हूं; ऐसे समय होते हैं जहां आप एक विशिष्ट चीज कर रहे हैं जो सेगफॉल्ट का कारण बन सकती है, और "वसूली" कोई मुद्दा नहीं है। –

1

उदाहरण के लिए, क्रैश स्टैक ट्रेस लॉग करने के लिए।

+0

+1: मुझे इस संभावना को इस प्रश्न में सूचीबद्ध करना चाहिए था (यानी मैंने पहले ही इस स्थिति को माना था): इसलिए, ऐसा करने के लिए मेरी गलती नहीं है। – jldupont

6

Segmentation Fault वास्तव में स्मृति तक पहुंच रहा है कि आपको एक्सेस करने की अनुमति नहीं है (या तो क्योंकि यह मैप नहीं किया गया है, आपके पास अनुमतियां, अमान्य वर्चुअल पता आदि नहीं हैं)।

अंतर्निहित कारण के आधार पर, आप सेगमेंटेशन गलती को जाल और संभालना चाहेंगे। उदाहरण के लिए, यदि आपका प्रोग्राम एक अवैध वर्चुअल पता पास कर दिया गया है, तो यह उस segfault को लॉग कर सकता है और फिर कुछ नुकसान नियंत्रण कर सकता है।

एक सेगफॉल्ट का मतलब यह नहीं है कि प्रोग्राम ढेर दूषित हो गया है। एक अमान्य पता पढ़ना (उदाहरण के लिए शून्य सूचक) परिणामस्वरूप segfault हो सकता है, लेकिन इसका मतलब यह नहीं है कि ढेर दूषित हो गया है। इसके अलावा, सी रनटाइम के आधार पर एक एप्लिकेशन में एकाधिक ढेर हो सकते हैं।

+0

@kervin: किस प्रकार का नुकसान नियंत्रण? उस समय तक ढेर जंक का ढेर हो सकता है – Alon

+0

@Alon: आपके प्रश्न को संबोधित करने के लिए संपादित किया गया। एक segfault का मतलब यह नहीं है कि ढेर दूषित है। इसके अलावा, आपके हैंडलर को उसी हीप या एड्रेस स्पेस का उपयोग नहीं करना पड़ता है जो सेगफॉल्ट से प्रभावित होता है। – kervin

+5

ढेर के अंत में अवरोध स्थापित करने के लिए कचरा संग्रह एल्गोरिदम दृष्टिकोण से सेगमेंटेशन दोषों का उपयोग किया जाता है, जब एक्सेस किया जाता है, और sigsegv वितरित किया जाता है, यह एक संकेत है कि एक जीसी की आवश्यकता होती है। – Christian

13

कारणों में से एक नंबर:

  1. एक दुर्घटना डिबग करने के लिए अधिक आवेदन विशेष जानकारी प्रदान करने के लिए। उदाहरण के लिए, मैं चरण 3 प्रसंस्करण फ़ाइल 'एक्स' पर दुर्घटनाग्रस्त हो गया।
  2. यह जांचने के लिए कि कुछ मेमोरी क्षेत्र पहुंच योग्य हैं या नहीं। यह ज्यादातर एक एम्बेडेड सिस्टम के लिए एक एपीआई संतुष्ट करने के लिए था। हम स्मृति क्षेत्र को लिखने और सीजीएफॉल्ट को पकड़ने की कोशिश करेंगे जो हमें बताता है कि स्मृति केवल पढ़ने के लिए थी।
  3. सेगफॉल्ट आम तौर पर एमएमयू से संकेत के साथ उत्पन्न होता है, जिसका उपयोग ऑपरेटिंग सिस्टम द्वारा आवश्यक होने पर स्मृति के पृष्ठों में स्वैप करने के लिए किया जाता है। यदि ओएस में स्मृति का वह पृष्ठ नहीं है, तो यह एप्लिकेशन पर सिग्नल को आगे बढ़ाता है।
+0

+1: .... धन्यवाद। – jldupont

+0

@ क्रिस: आपका जवाब बहुत अच्छा है (मेरे दृष्टिकोण से) लेकिन मैं केवल दुर्भाग्य से स्वीकार कर सकता हूं। आपके योगदान के लिए बहुत धन्यवाद। – jldupont

0

नहीं। मुझे लगता है कि यह समय बर्बाद है - एक सीजी गलती इंगित करती है कि आपके कोड में कुछ गड़बड़ है, और आपको कोर डंप और/या आपके स्रोत कोड की जांच करके इसे बेहतर तरीके से सलाह दी जाएगी। एक बार जब मैंने एक सीजी गलती को फँसाने की कोशिश की तो मुझे मिरर के एक हॉल में ले जाया गया जो मैं स्रोत कोड के बारे में सोचकर टाल सकता था। फिर कभी नहीं।

+0

+1: शिक्षित सलाह के लिए धन्यवाद। – jldupont

5

बहुत उन्नत तकनीकें हैं जो एक सेगमेंटेशन गलती को पकड़कर कार्यान्वित कर सकती हैं, अगर आपको पता है कि सेगमेंटेशन गलती कोई त्रुटि नहीं है। उदाहरण के लिए, आप पृष्ठों की रक्षा कर सकते हैं ताकि आप उनसे नहीं पढ़ सकें, और फिर पढ़ने से पहले "जादुई" व्यवहार करने के लिए SIGSEGV को जाल कर सकें। (Tomasz Węgrzanowski "Segfaulting own programs for fun and profit" देखें कि आप क्या कर सकते हैं, लेकिन आमतौर पर ओवरहेड बहुत अधिक है इसलिए यह करने योग्य नहीं है।)

एक समान सिद्धांत एक अवैध निर्देश अपवाद (आमतौर पर कर्नेल में) को फंसाने के लिए लागू होता है ताकि एक अनुकरण किया जा सके। निर्देश जो आपके प्रोसेसर पर लागू नहीं किया गया है।

+0

+1: इसके लिए धन्यवाद। – jldupont

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