2010-11-01 16 views
6

वर्तमान में मैं एक बार फिर स्थिति में हूं कि मुझे एक बग का कारण मिलना है जो डीबगर चलने पर लगभग कभी नहीं होता है (शायद कुछ दौड़ की स्थिति)। केवल उन्हीं चीजों को मैं ढूंढने के बारे में सोच सकता हूं:Heisenbugs को खोजने के लिए रणनीतियाँ

  1. डीबग प्रिंट के बिना डीबग प्रिंट और दावे जोड़ें जो मुझे बताता है कि डीबगर के बिना क्या चल रहा है।
  2. कोड के माध्यम से कदम उठाएं और हर पंक्ति और संभव दुष्प्रभावों के माध्यम से सोचें।

सभी यह सब में बहुत निराशा होती है। इस तरह की बग के साथ आपकी रणनीतियों और अनुभव क्या हैं?

संपादित करें: मैं विज़ुअल सी का उपयोग कर रहा ++ 2005 है, लेकिन मुझे लगता है कि सवाल कई (सभी) भाषाओं और विकास के वातावरण लागू होता है।

+2

@ मिच: आपके उत्तर देने के लिए प्रश्न संपादित करें। इसके अलावा, मैं चाहता था कि यह सीडब्ल्यू हो, लेकिन मेरे पास 10k प्रतिष्ठा तुरंत नहीं है, इसलिए मेरे लिए टिक सक्रिय करने के लिए स्वतंत्र हो गया। –

+0

मुझे नहीं लगता कि यह सीडब्ल्यू क्यों होना चाहिए (भले ही मैं इसे सेट कर सकूं) –

+2

@ मिच: क्योंकि इसका कोई निश्चित उत्तर नहीं है। यह * आपके अनुभव * प्रश्न साझा करने के लिए अधिक है। –

उत्तर

1

जब सभी तकनीक खत्म हो जाती है और बाउंड चेकर्स या तर्कसंगतता सहायता नहीं होती है। मैं आमतौर पर बहुत गूंगा तकनीक का उपयोग करता हूं। हमने इसे विश्वविद्यालय के पहले वर्ष में खोजा है। रूसी में इसे बहुत मोटा कहा जाता है।

तो - मैं बहुसंख्यक वातावरण में विफल होने वाले संदिग्ध ब्लॉक/मॉड्यूल को चुनने से शुरू कर रहा हूं। यदि यह असंभव है, तो कार्यक्रम संरचना फिर से फैक्टर है।

जब मॉड्यूल चुना जाता है तो मैं अपवाद गायब होने तक कोड के छोटे ब्लॉक पर टिप्पणी कर रहा हूं। यह पता लगाने की अनुमति देता है कि वास्तव में क्या कारण है (उदाहरण के लिए दौड़ की स्थिति)। यदि इस चरण में आप कह सकते हैं कि क्या गलत है - तो यह बहुत अच्छा है।

यदि नहीं, तो उसी तकनीक त्रुटि के पूर्व शर्त का पता लगाने के लिए आवेदन किया है, इसलिए मैं टिप्पणी से बाहर कर रहा हूँ कोड है कि अपराधी ब्लॉक पहले जोड़ता।

2

मैंने पाया मेरी C/C++/जावा कोड पर फाहा चल रहा है और यकीन है कि मैं हर चेतावनी इसे ठीक प्रदान करता है बनाने के लिए इन दौड़ की स्थिति अभी गायब करने के लिए नेतृत्व किया है। लेकिन यह कोई समाधान नहीं है। संयोग से कभी कोड नहीं। आपको समझना होगा कि आपने क्या तय किया है और यह समस्या क्यों तय की गई है।

मुझे विश्वास है कि यह कश्मीर (& & ||) आर कि कहा गया है कि प्रचुर प्रवेश संदेशों अधिक किया उन्हें किसी भी डिबगर से डिबग कोड मदद करना था - विशेष रूप से मल्टी-थ्रेडेड वातावरण में, लेकिन प्रशस्ति पत्र की जरूरत है।

ध्यान से सभी गतिविधि है कि बग वास्तव में उत्पन्न होने वाली एक बहुत मदद करता है अप करने के लिए नेतृत्व की एक बहुत विस्तृत पता लगाने के ऊपर देख।

+0

+1। – orangepips

4

आप बिंदु (रों), जिस पर समस्या पहले दिख रहा है की पहचान कर सकते हैं (नहीं है जब यह स्पष्ट रूप से कारण होता है), एक अपवाद वहाँ उठाते हैं और Process Dumper का उपयोग पोस्टमार्टम डिबगिंग के लिए एक डंप पाने के लिए।

आईडीई के बाहर अपनी रिलीज बाइनरी चलाएं और बाद में डीबगर संलग्न करें। इससे डिबगर के अंदर चलने वाले विशेष ढेर और अन्य झंडे से बचा जाता है।

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

निरीक्षण विकल्प - बस सुनिश्चित करें स्पष्ट याद किया गया है कुछ भी नहीं बनाने के लिए /W4 साथ बनाएँ।अगर किसी ने मिट्टी के तूफान को दूर किया है लेकिन महत्वपूर्ण चेतावनी या त्रुटि संदेश डाला है तो सी-स्टाइल के लिए कोड और चेतावनियां जांचें या reinterpret_cast देखें।

संबंधित मुद्दे