मेरे पास एक कमांड लाइन एप्लिकेशन है जो जब रन नहीं करता है तो उसे क्या करना चाहिए और एक निश्चित बिंदु पर संदेश छोड़ देता है:
Segmentation fault
इसका क्या मतलब है? मुझे क्या करना चाहिए?
मेरे पास एक कमांड लाइन एप्लिकेशन है जो जब रन नहीं करता है तो उसे क्या करना चाहिए और एक निश्चित बिंदु पर संदेश छोड़ देता है:
Segmentation fault
इसका क्या मतलब है? मुझे क्या करना चाहिए?
जवाबों:
एक विभाजन दोष एक मेमोरी एक्सेस उल्लंघन का परिणाम है। इस कार्यक्रम को एक मेमोरी पते के बाहर संदर्भित किया गया है जो इसे आवंटित किया गया था, और ओएस कर्नेल 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
यह काम कर सकता है, या मैन पेज यह संकेत दे सकता है कि इसे कैसे प्राप्त करें),
किसी को उम्मीद है कि आप बहुत लंबे समय में वापस नहीं आएंगे। दाखिल कीड़े आमतौर पर सराहना की जाती है।
gdb
करता है सामान की एक बहुत कुछ । आप धारा 5.1
इसका मतलब है कि एप्लिकेशन में बग है।
यदि आप एंड-यूज़र हैं, तो आपको एप्लिकेशन के विक्रेता से संपर्क करना चाहिए।
यदि यह आपका अपना आवेदन है, तो आप कर सकते हैं:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
कोर फाइलें खुद के अलावा अन्य डेवलपर्स के लिए भी बहुत उपयोगी होंगी - इनमें दुर्घटना के समय कार्यक्रम की पूरी स्थिति होती है; यदि आप बग रिपोर्ट दर्ज करने जा रहे हैं, तो उन्हें संलग्न करें, और कुछ मामलों में आपका ऐप बाइनरी। इस बात से अवगत रहें कि दुर्घटना के समय कार्यक्रम की याद में आपका व्यक्तिगत डेटा जैसे खाता संख्या, पासवर्ड और समान हो सकता है। कई मामलों में, दुर्घटनाग्रस्त धागे के सिर्फ बैकट्रेस की रिपोर्टिंग करने से डेवलपर्स को समस्या का पता लगाने में मदद मिलती है। बैकट्रेस प्राप्त करने के लिए, आप कोर फ़ाइल को डिबगर (जैसे gdb executable corefile
) के साथ लोड कर सकते हैं ।