रनिंग एप्लिकेशन "सेगमेंटेशन फॉल्ट" के साथ समाप्त होता है


40

मेरे पास एक कमांड लाइन एप्लिकेशन है जो जब रन नहीं करता है तो उसे क्या करना चाहिए और एक निश्चित बिंदु पर संदेश छोड़ देता है:

Segmentation fault

इसका क्या मतलब है? मुझे क्या करना चाहिए?


जवाबों:


63

एक विभाजन दोष एक मेमोरी एक्सेस उल्लंघन का परिणाम है। इस कार्यक्रम को एक मेमोरी पते के बाहर संदर्भित किया गया है जो इसे आवंटित किया गया था, और ओएस कर्नेल SIGREGV के साथ कार्यक्रम को मारकर जवाब देता है।

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

ऐसा करने के लिए, आप प्रोग्राम को अंदर gdb(जीएनयू डिबगर) चला सकते हैं , जो कि किसी भी लिनक्स डिस्ट्रो से उपलब्ध होना चाहिए अगर यह पहले से स्थापित नहीं है (पैकेज को केवल "जीडीबी" कहा जाएगा)। यदि टूटे हुए एप्लिकेशन को "टूटा हुआ" कहा जाता है:

gdb brokenapp

कॉपीराइट और लाइसेंसिंग के बारे में एक पैराग्राफ दिखाई देगा, और अंत में कर्सर के साथ एक संकेत:

(gdb) _ 

टाइप करें runऔर एंटर करें। यदि आपको तर्कों की आपूर्ति करने की आवश्यकता है (उदाहरण के लिए -x --foo=bar whatever) उन ( run -x --foo=bar whatever) को जोड़ें । कार्यक्रम वह करेगा जो आप करता है, आप आउटपुट देखेंगे और यदि आपको बातचीत करने की आवश्यकता है (ध्यान दें कि आप किसी भी प्रकार के प्रोग्राम को चला सकते हैं, जिसमें जीयूआई एक, जीडीबी के अंदर) शामिल है। इस बिंदु पर जहां यह आमतौर पर segfaults आपको दिखाई देगा:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

यहां आउटपुट की दूसरी लाइन सिर्फ एक उदाहरण है। अब टाइप करें bt("बैकट्रेस" के लिए) और एंटर दबाएं। आप कुछ इस तरह देखेंगे, हालाँकि यह बहुत लंबा हो सकता है:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

यदि यह लंबा है, तो आपको केवल एक समय में एक स्क्रीनफुल मिलेगा और एक --More--संदेश होगा। जब तक यह पूरा नहीं हो जाता, तब तक मारते रहें। अब आप कर सकते हैं quit, आउटपुट आपके टर्मिनल में रहेगा। Program received signal SIGSEGVएक पाठ फ़ाइल में आगे से सब कुछ कॉपी करें , और एप्लिकेशन के बग ट्रैकर के साथ एक बग रिपोर्ट दर्ज करें; आप इन ऑनलाइन खोज कर सकते हैं, उदाहरण के लिए "टूटी बग रिपोर्ट" - आपको शायद पंजीकृत करना होगा इसलिए उत्तर आपको ईमेल द्वारा भेजा जा सकता है। समस्या का अपना विवरण, आपके द्वारा आपूर्ति की गई कोई भी दलीलें run, आदि, और बैकट्रेस की एक प्रति (यदि यह बहुत लंबी है, तो बग ट्रैकर इंटरफ़ेस में एक पाठ फ़ाइल संलग्न करने का एक साधन हो सकता है)। संस्करण भी शामिल करें, यदि आप जानते हैं कि यह क्या है ( brokenapp --versionयह काम कर सकता है, या मैन पेज यह संकेत दे सकता है कि इसे कैसे प्राप्त करें),

किसी को उम्मीद है कि आप बहुत लंबे समय में वापस नहीं आएंगे। दाखिल कीड़े आमतौर पर सराहना की जाती है।


1
विभाजन की व्याख्या व्याख्याकारों की भाषा में भी हो सकती है (केवल इसलिए कि दुभाषिया में कीड़े होने के कारण),
ब्रियम जूल

यह सुपर उपयोगी है! क्या अंदर कदम रखने की संभावना है? स्टॉप मार्क लगाएं और अधिक जानने का प्रयास करें?
जॉएल स्मिएर्त्नी

1
@ZloySmiertniy gdbकरता है सामान की एक बहुत कुछ । आप धारा 5.1
गोल्डीलॉक्स

11

इसका मतलब है कि एप्लिकेशन में बग है।

  • यदि आप एंड-यूज़र हैं, तो आपको एप्लिकेशन के विक्रेता से संपर्क करना चाहिए।

    • यदि यह लिनक्स वितरण के साथ आया है, तो आपको उस वितरण के लिए एक बग रिपोर्ट तैयार करनी चाहिए।
    • थर्ड-पार्टी नॉन-कमर्शियल ऐप्स के लिए आपको लेखक को बग या इस विशेष एप्लिकेशन बग ट्रैकर को रिपोर्ट करना चाहिए। आमतौर पर आप ब्राउजिंग एप्लिकेशन साइट या डाउनलोड किए गए बाइनरी / सोर्स पैकेज द्वारा जगह पा सकते हैं।
    • व्यावसायिक ऐप्स के लिए आपको समर्थन से संपर्क करना चाहिए।
  • यदि यह आपका अपना आवेदन है, तो आप कर सकते हैं:

    1. मुख्य फ़ाइलें सक्षम करें: $ ulimit -c unlimited
    2. दुर्घटना को पुन: उत्पन्न करें: $ ./yourapp
    3. gdb के साथ डिबग क्रैश: $ gdb ./yourapp core

कोर फाइलें खुद के अलावा अन्य डेवलपर्स के लिए भी बहुत उपयोगी होंगी - इनमें दुर्घटना के समय कार्यक्रम की पूरी स्थिति होती है; यदि आप बग रिपोर्ट दर्ज करने जा रहे हैं, तो उन्हें संलग्न करें, और कुछ मामलों में आपका ऐप बाइनरी। इस बात से अवगत रहें कि दुर्घटना के समय कार्यक्रम की याद में आपका व्यक्तिगत डेटा जैसे खाता संख्या, पासवर्ड और समान हो सकता है। कई मामलों में, दुर्घटनाग्रस्त धागे के सिर्फ बैकट्रेस की रिपोर्टिंग करने से डेवलपर्स को समस्या का पता लगाने में मदद मिलती है। बैकट्रेस प्राप्त करने के लिए, आप कोर फ़ाइल को डिबगर (जैसे gdb executable corefile) के साथ लोड कर सकते हैं ।


Microsoft के संवाद बॉक्स के अनुसार, आपको अपने विक्रेता से "यदि समस्या बनी रहती है" से संपर्क करना चाहिए, अन्यथा परेशान न हों। दुर्लभ दुर्घटनाओं असली कीड़े नहीं हैं, केवल प्रजनन योग्य हैं।
काज

4
मेरा अवलोकन यह है कि Microsoft सॉफ़्टवेयर की गुणवत्ता UNIX सॉफ़्टवेयर की तुलना में बहुत से मामलों में कम है, और यह अच्छा है कि UNIX दुनिया में लोग आमतौर पर अपने दिशानिर्देशों का संदर्भ नहीं देते हैं।
gena2x
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.