कंसूरेंसी बग को पुन: पेश करने के लिए कड़ी मेहनत के लिए कुछ युक्तियां क्या हैं, केवल एक बार परीक्षण के हर हज़ार रन कहें? मेरे पास इनमें से एक है और मुझे नहीं पता कि इसे डिबग करने के बारे में कैसे जाना है। मैं आंतरिक स्थिति का निरीक्षण करने के लिए पूरे स्थान पर प्रिंट स्टेटमेंट या डिबगर घड़ियों को नहीं डाल सकता, क्योंकि यह समय बदल जाएगा और बग सफलतापूर्वक पुन: उत्पन्न होने पर भारी मात्रा में जानकारी का उत्पादन करेगा।कंसुरेंसी बग हार्ड-टू-रीप्रोडस डीबग करने के लिए टिप्स?
उत्तर
यहां मेरी तकनीक है: मैं आम तौर पर जितनी बार संभव हो सके डेटा स्थिरता/वैधता की जांच करने के लिए बहुत सारे जोर() का उपयोग करता हूं। जब कोई जोर विफल हो जाता है, तो प्रोग्राम कोर फ़ाइल उत्पन्न करता है। फिर मैं कोर फ़ाइल के साथ एक डीबगर का उपयोग यह समझने के लिए करता हूं कि थ्रेड कॉन्फ़िगरेशन ने डेटा भ्रष्टाचार का नेतृत्व किया था।
यह समस्या की प्रकृति पर अत्यधिक निर्भर करता है। आशा है कि जब समस्या अगली बार पुन: उत्पन्न होगी, तो अगली बार पुन: उत्पन्न होने पर उम्मीद है कि थ्रेड आईडी, लॉक/अनलॉक गिनती, लॉकिंग ऑर्डर इत्यादि तक पहुंचने के लिए दावे के साथ + कोड "इंस्ट्रूमेंटेशन" एक वर्बोज़ संदेश या कोर-डंप आपको समाधान दे देगा। संगामिति बग की वजह से डेटा भ्रष्टाचार को खोजने के लिए
एक विधि:
- कि डेटा या बफर के लिए एक परमाणु काउंटर जोड़ें।
- सभी मौजूदा सिंक्रनाइज़िंग कोड को छोड़ दें - उन्हें संशोधित न करें, यह मानते हुए कि आप मौजूदा कोड में बग को ठीक करने जा रहे हैं, जबकि बग ठीक होने के बाद नया परमाणु काउंटर हटा दिया जाएगा।
- डेटा संशोधित करना प्रारंभ करते समय, परमाणु काउंटर को बढ़ाएं। समाप्त होने पर, कमी।
- कोर डंप जैसे ही आप को खोजने के रूप में वह यह है कि काउंटर एक से अधिक (कुछ का उपयोग कर InterlockedIncrement के समान)
लक्षित इकाई परीक्षण कोड मेरे अनुभव में समय लेने वाली लेकिन प्रभावी है,।
जितना संभव हो उतना असफल कोड को संक्षिप्त करें। परीक्षण कोड लिखें जो स्पष्ट अपराधी कोड के लिए विशिष्ट है और इसे तब तक डीबगर में चलाएं जब तक कि समस्या को पुन: उत्पन्न करने में लगे।
यह आपकी मदद नहीं कर सकता है लेकिन शायद भविष्य में इस प्रश्न को देखने में मदद करेगा।
यदि आप .Net भाषा का उपयोग कर रहे हैं तो आप माइक्रोसॉफ्ट रिसर्च से CHESS प्रोजेक्ट का उपयोग कर सकते हैं। यह प्रत्येक प्रकार के थ्रेड इंटरलिविंग के साथ यूनिट परीक्षण चलाता है और आपको दिखाता है कि कौन से बग होने का कारण बनता है।
आपके द्वारा उपयोग की जाने वाली भाषा के लिए एक समान टूल हो सकता है।
लिंक अब टूटा हुआ लगता है –
मैं जो रणनीतियों का उपयोग करता हूं उनमें से एक है धागे की अंतराल को अनुकरण करना स्पिन इंतजार कर रहा है। चेतावनी यह है कि आपको अपने प्लेटफ़ॉर्म के लिए मानक स्पिन प्रतीक्षा तंत्र का उपयोग नहीं करना चाहिए क्योंकि वे स्मृति बाधाओं को पेश करेंगे। यदि आप जिस समस्या का निवारण करने का प्रयास कर रहे हैं वह स्मृति बाधा की कमी के कारण होता है (क्योंकि लॉक-फ्री रणनीतियों का उपयोग करते समय बाधाओं को सही करना मुश्किल होता है) तो मानक स्पिन प्रतीक्षा तंत्र केवल समस्या को मुखौटा कर देगा। इसके बजाय, उन बिंदुओं पर एक खाली लूप रखें जहां आप अपने कोड को एक पल के लिए रोकना चाहते हैं। यह एक समवर्ती बग को पुन: उत्पन्न करने की संभावना को बढ़ा सकता है, लेकिन यह एक जादू बुलेट नहीं है।
बग एक गतिरोध है, तो बस कार्यक्रम के बाद गतिरोध होता है डीबगिंग टूल (जैसे gdb
या strace
) संलग्न है, और अवलोकन जहां प्रत्येक धागा अटक है, अक्सर आप नीचे ट्रैक करने के लिए पर्याप्त जानकारी प्राप्त कर सकते हैं त्रुटि का स्रोत जल्दी से।
मल्टीथ्रेड कोड को डिबग करने में ध्यान देने के लिए मैंने कुछ डीबगिंग तकनीकों के साथ एक छोटा सा चार्ट बनाया है। चार्ट बढ़ रहा है, कृपया जोड़ने के लिए टिप्पणियां और सुझाव छोड़ दें। http://adec.altervista.org/blog/multithreading-debugging-chart/
- 1. स्प्रिंग अनुप्रयोगों को डीबग करने के लिए टिप्स या टूल्स?
- 2. पेनलेट विकसित करने के लिए टिप्स
- 3. अन्य भाषाओं के लिए एरलांग-स्टाइल कंसुरेंसी
- 4. आईओएस डेवलपर के लिए टिप्स?
- 5. पोस्टग्रेस्क्ल कंसुरेंसी
- 6. जावा कंसुरेंसी
- 7. संख्यात्मक स्थिरता मुद्दों को डीबग करने के लिए रणनीतियां?
- 8. टिप्स
- 9. कॉम्प्लेक्स सीएजीएस खोज पथ सेट करने के लिए टिप्स
- 10. उत्पादन में कॉमन्स-पूल का उपयोग करने के लिए टिप्स
- 11. एक बड़े जावास्क्रिप्ट प्रोजेक्ट पर काम करने के लिए टिप्स
- 12. VerifyError डीबग करने के लिए अच्छे उपकरण?
- 13. जावा कंसुरेंसी: लॉक क्षमता
- 14. स्प्रिंग बीन हैंडल कंसुरेंसी
- 15. वितरित कंसुरेंसी कंट्रोल
- 16. क्लोजर फ़ंक्शंस डीबग करने के लिए अनुशंसित तरीके?
- 17. जावा इटरेटर कंसुरेंसी
- 18. jQuery के लिए टिप्स प्लगइन कहां है?
- 19. फाइलों में समानताएं दिखाने के लिए टिप्स
- 20. हल्के एंड्रॉइड अनुप्रयोगों के लिए टिप्स
- 21. कुशल जीएलएसएल कोड के लिए टिप्स
- 22. बर्कले डीबी कंसुरेंसी
- 23. टूल टिप्स (title = "...") फ़ायरफ़ॉक्स
- 24. एंड्रॉइड डिबगिंग टिप्स
- 25. एक स्टैक स्मैशिंग बग को अलग करने के लिए उपकरण
- 26. छोड़े गए मेमोरी और ढेर के विकास को खोजने और डिबग करने के लिए टिप्स
- 27. सीईडीईटी स्केलेबिलिटी टिप्स
- 28. टूल टिप्स
- 29. मोबाइल ब्राउज़र के लिए वेब पेजों को डिजाइन करने के लिए टिप्स?
- 30. objc_msgSend के भीतर एक क्रैश डीबग करने के लिए सबसे अच्छा कैसे है?
क्या यह डेटा भ्रष्टाचार मुद्दा (एक स्मृति स्थान, चर या बफर) है, या यह एक फ़ंक्शन कॉल समस्या है (फ़ंक्शंस को आउट-ऑफ-अनुक्रम या अप्रत्याशित समय पर कहा जाता है)? पहचान तकनीक अलग हैं। – rwong
@wong: डेटा भ्रष्टाचार। – dsimcha