मुझे पता है कि, पर्याप्त संदर्भ दिया गया है, कोई segfault स्थिति से रचनात्मक रूप से (यानी पुनर्प्राप्ति) का उपयोग करने की उम्मीद कर सकता है।क्या "segfault" को फँसाने का कोई मुद्दा है?
लेकिन, क्या यह प्रयास संभव है? यदि हां, तो किस स्थिति में?
मुझे पता है कि, पर्याप्त संदर्भ दिया गया है, कोई segfault स्थिति से रचनात्मक रूप से (यानी पुनर्प्राप्ति) का उपयोग करने की उम्मीद कर सकता है।क्या "segfault" को फँसाने का कोई मुद्दा है?
लेकिन, क्या यह प्रयास संभव है? यदि हां, तो किस स्थिति में?
आप वास्तव में एक सेगफॉल्ट से पुनर्प्राप्त होने की उम्मीद नहीं कर सकते हैं। आप यह पता लगा सकते हैं कि ऐसा हुआ है, और यदि संभव हो तो प्रासंगिक एप्लिकेशन-विशिष्ट स्थिति को डंप करें, लेकिन आप प्रक्रिया को जारी नहीं रख सकते हैं। ऐसा इसलिए है क्योंकि (दूसरों के बीच)
तो छोड़ने की तुलना में अधिक समस्याओं का कारण बनता बाद में डेटा त्रुटियों या आगे बुरा व्यवहार का कारण है, वहाँ यह फँसाने और एक काफी अचानक फैशन में प्रक्रिया समाप्त छोड़कर कुछ भी करने का कोई मतलब नहीं है।डिस्क पर वापस (महत्वपूर्ण) डेटा लिखने का प्रयास करने में कोई बात नहीं है, या अन्य उपयोगी काम करना जारी रखें। लॉग इन करने के लिए राज्य को डंप करने में कुछ बिंदु है- जो कई एप्लिकेशन करते हैं - और फिर छोड़ते हैं।
संभवतः उपयोगी काम करने के लिए आपकी खुद की प्रक्रिया निष्पादित हो सकती है, या एक वॉचडॉग प्रक्रिया है जो क्रैश के मामले में इसे पुनरारंभ करती है। (एनबी: यदि आपकी प्रक्रिया में> 1 थ्रेड है तो निष्पादन में हमेशा परिभाषित व्यवहार नहीं होता है)
उदाहरण के लिए, क्रैश स्टैक ट्रेस लॉग करने के लिए।
+1: मुझे इस संभावना को इस प्रश्न में सूचीबद्ध करना चाहिए था (यानी मैंने पहले ही इस स्थिति को माना था): इसलिए, ऐसा करने के लिए मेरी गलती नहीं है। – jldupont
Segmentation Fault वास्तव में स्मृति तक पहुंच रहा है कि आपको एक्सेस करने की अनुमति नहीं है (या तो क्योंकि यह मैप नहीं किया गया है, आपके पास अनुमतियां, अमान्य वर्चुअल पता आदि नहीं हैं)।
अंतर्निहित कारण के आधार पर, आप सेगमेंटेशन गलती को जाल और संभालना चाहेंगे। उदाहरण के लिए, यदि आपका प्रोग्राम एक अवैध वर्चुअल पता पास कर दिया गया है, तो यह उस segfault को लॉग कर सकता है और फिर कुछ नुकसान नियंत्रण कर सकता है।
एक सेगफॉल्ट का मतलब यह नहीं है कि प्रोग्राम ढेर दूषित हो गया है। एक अमान्य पता पढ़ना (उदाहरण के लिए शून्य सूचक) परिणामस्वरूप segfault हो सकता है, लेकिन इसका मतलब यह नहीं है कि ढेर दूषित हो गया है। इसके अलावा, सी रनटाइम के आधार पर एक एप्लिकेशन में एकाधिक ढेर हो सकते हैं।
@kervin: किस प्रकार का नुकसान नियंत्रण? उस समय तक ढेर जंक का ढेर हो सकता है – Alon
@Alon: आपके प्रश्न को संबोधित करने के लिए संपादित किया गया। एक segfault का मतलब यह नहीं है कि ढेर दूषित है। इसके अलावा, आपके हैंडलर को उसी हीप या एड्रेस स्पेस का उपयोग नहीं करना पड़ता है जो सेगफॉल्ट से प्रभावित होता है। – kervin
ढेर के अंत में अवरोध स्थापित करने के लिए कचरा संग्रह एल्गोरिदम दृष्टिकोण से सेगमेंटेशन दोषों का उपयोग किया जाता है, जब एक्सेस किया जाता है, और sigsegv वितरित किया जाता है, यह एक संकेत है कि एक जीसी की आवश्यकता होती है। – Christian
कारणों में से एक नंबर:
नहीं। मुझे लगता है कि यह समय बर्बाद है - एक सीजी गलती इंगित करती है कि आपके कोड में कुछ गड़बड़ है, और आपको कोर डंप और/या आपके स्रोत कोड की जांच करके इसे बेहतर तरीके से सलाह दी जाएगी। एक बार जब मैंने एक सीजी गलती को फँसाने की कोशिश की तो मुझे मिरर के एक हॉल में ले जाया गया जो मैं स्रोत कोड के बारे में सोचकर टाल सकता था। फिर कभी नहीं।
+1: शिक्षित सलाह के लिए धन्यवाद। – jldupont
बहुत उन्नत तकनीकें हैं जो एक सेगमेंटेशन गलती को पकड़कर कार्यान्वित कर सकती हैं, अगर आपको पता है कि सेगमेंटेशन गलती कोई त्रुटि नहीं है। उदाहरण के लिए, आप पृष्ठों की रक्षा कर सकते हैं ताकि आप उनसे नहीं पढ़ सकें, और फिर पढ़ने से पहले "जादुई" व्यवहार करने के लिए SIGSEGV को जाल कर सकें। (Tomasz Węgrzanowski "Segfaulting own programs for fun and profit" देखें कि आप क्या कर सकते हैं, लेकिन आमतौर पर ओवरहेड बहुत अधिक है इसलिए यह करने योग्य नहीं है।)
एक समान सिद्धांत एक अवैध निर्देश अपवाद (आमतौर पर कर्नेल में) को फंसाने के लिए लागू होता है ताकि एक अनुकरण किया जा सके। निर्देश जो आपके प्रोसेसर पर लागू नहीं किया गया है।
+1: इसके लिए धन्यवाद। – jldupont
+1: अद्भुत जवाब ... बहुत बहुत धन्यवाद। – jldupont
एक अच्छा सारांश है, लेकिन मैं अपने उत्तर में वर्णित कारण के लिए असहमत हूं; ऐसे समय होते हैं जहां आप एक विशिष्ट चीज कर रहे हैं जो सेगफॉल्ट का कारण बन सकती है, और "वसूली" कोई मुद्दा नहीं है। –