का उपयोग न करने पर segfault मेरे पास एक बहुप्रचारित सी प्रोग्राम है, जो प्रोग्राम में एक विशिष्ट बिंदु पर लगातार सेगमेंटेशन गलती उत्पन्न करता है। जब मैं इसे जीडीबी के साथ चलाता हूं, तो कोई गलती नहीं दिखाई जाती है। क्या आप किसी भी कारण से सोच सकते हैं कि दोष केवल तभी हो सकता है जब डीबगर का उपयोग न हो? समस्या को हल करने के लिए इसका उपयोग करने में सक्षम होने के कारण यह बहुत परेशान है!केवल डीगगर
उत्तर
क्लासिक Heisenbug। विकिपीडिया से:
समय हेइसेनबग में भी एक कारक हो सकता है। डीबगर के नियंत्रण में एक प्रोग्राम को निष्पादित करना सामान्य निष्पादन की तुलना में कार्यक्रम के निष्पादन समय को बदल सकता है। समय-संवेदी बग जैसे रेस स्थितियां पुन: उत्पन्न नहीं हो सकती हैं जब प्रोग्राम डीबगर में सिंगल-स्टेपिंग स्रोत लाइनों द्वारा धीमा हो जाता है। यह विशेष रूप से सच है जब व्यवहार में एक इकाई के साथ बातचीत होती है जो डीबगर के नियंत्रण में नहीं होती है, जैसे कि दो मशीनों के बीच नेटवर्क पैकेट प्रोसेसिंग डीबग करते समय और केवल एक डीबगर नियंत्रण में होता है।
डीबगर समय बदल रहा है, और दौड़ की स्थिति छुपा सकता है।
लिनक्स पर, जीडीबी पता स्थान यादृच्छिकरण को भी अक्षम करता है, और आपका क्रैश स्थान लेआउट को संबोधित करने के लिए विशिष्ट हो सकता है। (gdb) set disable-randomization off
आज़माएं।
अंत में, ulimit -c unlimited
और पोस्ट-मॉर्टम डीबगिंग (रोबी द्वारा पहले से सुझाया गया) काम कर सकता है।
इसे डीबग करके आप उस वातावरण को बदल रहे हैं जिसमें यह चल रहा है। ऐसा लगता है कि आप किसी प्रकार की दौड़ की स्थिति से निपट रहे हैं, और इसे डिबग करके इसे चीजों को थोड़ा अलग तरीके से निर्धारित किया गया है ताकि आपको समस्या का सामना न हो। वह, या चीजों को थोड़ा अलग तरीके से संग्रहीत किया जा रहा है, इसलिए ऐसा नहीं होता है। क्या आप समस्या को समझने में सहायता के लिए कोड में कुछ डीबगिंग आउटपुट डाल सकते हैं? इससे कम प्रभाव हो सकता है और आपको अपनी समस्या मिल सकती है।
शायद gdb
मेमोरी का उपयोग करते समय स्मृति उस स्थान पर मैप की जाती है जहां आपका ओवर/अंडर फ्लैश स्मृति पर ट्राम नहीं करता है जो क्रैश का कारण बनता है। या यह एक दौड़ की स्थिति हो सकती है जो अब ट्रिप नहीं हो रही है। हालांकि यह अनजान लगता है, आपको खुश होना चाहिए आपका प्रोग्राम आपको क्रैश करने के लिए काफी अच्छा था।
कुछ सुझाव
मैं इसे चलाने की कोशिश करें libefence
इस तरह की बग को "हेइज़बग"] (http://en.wikipedia.org/wiki/Heisenbug#Heisenbug) कहा जाता है और इसके कई कारण हो सकते हैं। –
क्या त्रुटि विंडो प्रबंधन और/या User32.dll से संबंधित होती है? – Mehrdad
मुझे इस तरह का कोई मुद्दा था, मेरा प्रोग्राम केवल जीडीबी के साथ दुर्घटनाग्रस्त हो गया। मुद्दा यह था कि जब मैं अपना प्रोग्राम चलाता था तब एक अनियमित क्लास सदस्य चर वैल्यू 0 प्राप्त कर रहा था, लेकिन जब मैंने इसे जीडीबी में चलाया तो उसके पास कुछ बड़ा मूल्य था जो मैंने इसे सरणी इंडेक्स के रूप में इस्तेमाल करते समय segfaulted किया था। – GWW