2011-01-07 10 views
42

का उपयोग न करने पर segfault मेरे पास एक बहुप्रचारित सी प्रोग्राम है, जो प्रोग्राम में एक विशिष्ट बिंदु पर लगातार सेगमेंटेशन गलती उत्पन्न करता है। जब मैं इसे जीडीबी के साथ चलाता हूं, तो कोई गलती नहीं दिखाई जाती है। क्या आप किसी भी कारण से सोच सकते हैं कि दोष केवल तभी हो सकता है जब डीबगर का उपयोग न हो? समस्या को हल करने के लिए इसका उपयोग करने में सक्षम होने के कारण यह बहुत परेशान है!केवल डीगगर

+3

इस तरह की बग को "हेइज़बग"] (http://en.wikipedia.org/wiki/Heisenbug#Heisenbug) कहा जाता है और इसके कई कारण हो सकते हैं। –

+0

क्या त्रुटि विंडो प्रबंधन और/या User32.dll से संबंधित होती है? – Mehrdad

+1

मुझे इस तरह का कोई मुद्दा था, मेरा प्रोग्राम केवल जीडीबी के साथ दुर्घटनाग्रस्त हो गया। मुद्दा यह था कि जब मैं अपना प्रोग्राम चलाता था तब एक अनियमित क्लास सदस्य चर वैल्यू 0 प्राप्त कर रहा था, लेकिन जब मैंने इसे जीडीबी में चलाया तो उसके पास कुछ बड़ा मूल्य था जो मैंने इसे सरणी इंडेक्स के रूप में इस्तेमाल करते समय segfaulted किया था। – GWW

उत्तर

62

क्लासिक Heisenbug। विकिपीडिया से:

समय हेइसेनबग में भी एक कारक हो सकता है। डीबगर के नियंत्रण में एक प्रोग्राम को निष्पादित करना सामान्य निष्पादन की तुलना में कार्यक्रम के निष्पादन समय को बदल सकता है। समय-संवेदी बग जैसे रेस स्थितियां पुन: उत्पन्न नहीं हो सकती हैं जब प्रोग्राम डीबगर में सिंगल-स्टेपिंग स्रोत लाइनों द्वारा धीमा हो जाता है। यह विशेष रूप से सच है जब व्यवहार में एक इकाई के साथ बातचीत होती है जो डीबगर के नियंत्रण में नहीं होती है, जैसे कि दो मशीनों के बीच नेटवर्क पैकेट प्रोसेसिंग डीबग करते समय और केवल एक डीबगर नियंत्रण में होता है।

डीबगर समय बदल रहा है, और दौड़ की स्थिति छुपा सकता है।

लिनक्स पर, जीडीबी पता स्थान यादृच्छिकरण को भी अक्षम करता है, और आपका क्रैश स्थान लेआउट को संबोधित करने के लिए विशिष्ट हो सकता है। (gdb) set disable-randomization off आज़माएं।

अंत में, ulimit -c unlimited और पोस्ट-मॉर्टम डीबगिंग (रोबी द्वारा पहले से सुझाया गया) काम कर सकता है।

+8

'सेट अक्षम-यादृच्छिकरण बंद' मेरे लिए एक समान समस्या हल! –

+0

क्या होगा यदि मैं एलएलडीबी का उपयोग कर रहा हूं? बराबर कमांड क्या है? – thiagoh

+0

@ थियागोः दुर्भाग्य से मुझे नहीं पता (मैं वह नहीं हूं जिसने इसे संपादित किया है), आप किसी और से पूछना चाहेंगे ... – Mehrdad

4

इसे डीबग करके आप उस वातावरण को बदल रहे हैं जिसमें यह चल रहा है। ऐसा लगता है कि आप किसी प्रकार की दौड़ की स्थिति से निपट रहे हैं, और इसे डिबग करके इसे चीजों को थोड़ा अलग तरीके से निर्धारित किया गया है ताकि आपको समस्या का सामना न हो। वह, या चीजों को थोड़ा अलग तरीके से संग्रहीत किया जा रहा है, इसलिए ऐसा नहीं होता है। क्या आप समस्या को समझने में सहायता के लिए कोड में कुछ डीबगिंग आउटपुट डाल सकते हैं? इससे कम प्रभाव हो सकता है और आपको अपनी समस्या मिल सकती है।

5

शायद gdb मेमोरी का उपयोग करते समय स्मृति उस स्थान पर मैप की जाती है जहां आपका ओवर/अंडर फ्लैश स्मृति पर ट्राम नहीं करता है जो क्रैश का कारण बनता है। या यह एक दौड़ की स्थिति हो सकती है जो अब ट्रिप नहीं हो रही है। हालांकि यह अनजान लगता है, आपको खुश होना चाहिए आपका प्रोग्राम आपको क्रैश करने के लिए काफी अच्छा था।

कुछ सुझाव

  1. नि: शुल्क cppcheck
  2. के रूप में एक स्थिर कोड विश्लेषक का प्रयास के माध्यम से valgrind
1

मैं इसे चलाने की कोशिश करें libefence

  • की तरह एक malloc() डिबगर का प्रयास करें पहले इस समस्या को पूरी तरह से मिला है! यह दौड़ की स्थिति थी, और जब मैं एक डीबगर के साथ कोड था, तो थ्रेड मैं था, मैं दौड़ की स्थिति को ट्रिगर करने के लिए पर्याप्त धीमी थी। बहुत भद्दा।