2011-04-28 12 views
6

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

+0

क्या यह डेटा भ्रष्टाचार मुद्दा (एक स्मृति स्थान, चर या बफर) है, या यह एक फ़ंक्शन कॉल समस्या है (फ़ंक्शंस को आउट-ऑफ-अनुक्रम या अप्रत्याशित समय पर कहा जाता है)? पहचान तकनीक अलग हैं। – rwong

+0

@wong: डेटा भ्रष्टाचार। – dsimcha

उत्तर

5

यहां मेरी तकनीक है: मैं आम तौर पर जितनी बार संभव हो सके डेटा स्थिरता/वैधता की जांच करने के लिए बहुत सारे जोर() का उपयोग करता हूं। जब कोई जोर विफल हो जाता है, तो प्रोग्राम कोर फ़ाइल उत्पन्न करता है। फिर मैं कोर फ़ाइल के साथ एक डीबगर का उपयोग यह समझने के लिए करता हूं कि थ्रेड कॉन्फ़िगरेशन ने डेटा भ्रष्टाचार का नेतृत्व किया था।

1

यह समस्या की प्रकृति पर अत्यधिक निर्भर करता है। आशा है कि जब समस्या अगली बार पुन: उत्पन्न होगी, तो अगली बार पुन: उत्पन्न होने पर उम्मीद है कि थ्रेड आईडी, लॉक/अनलॉक गिनती, लॉकिंग ऑर्डर इत्यादि तक पहुंचने के लिए दावे के साथ + कोड "इंस्ट्रूमेंटेशन" एक वर्बोज़ संदेश या कोर-डंप आपको समाधान दे देगा। संगामिति बग की वजह से डेटा भ्रष्टाचार को खोजने के लिए

1

एक विधि:

  • कि डेटा या बफर के लिए एक परमाणु काउंटर जोड़ें।
    • सभी मौजूदा सिंक्रनाइज़िंग कोड को छोड़ दें - उन्हें संशोधित न करें, यह मानते हुए कि आप मौजूदा कोड में बग को ठीक करने जा रहे हैं, जबकि बग ठीक होने के बाद नया परमाणु काउंटर हटा दिया जाएगा।
  • डेटा संशोधित करना प्रारंभ करते समय, परमाणु काउंटर को बढ़ाएं। समाप्त होने पर, कमी।
  • कोर डंप जैसे ही आप को खोजने के रूप में वह यह है कि काउंटर एक से अधिक (कुछ का उपयोग कर InterlockedIncrement के समान)
0

लक्षित इकाई परीक्षण कोड मेरे अनुभव में समय लेने वाली लेकिन प्रभावी है,।

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

2

यह आपकी मदद नहीं कर सकता है लेकिन शायद भविष्य में इस प्रश्न को देखने में मदद करेगा।

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

आपके द्वारा उपयोग की जाने वाली भाषा के लिए एक समान टूल हो सकता है।

+0

लिंक अब टूटा हुआ लगता है –

0

मैं जो रणनीतियों का उपयोग करता हूं उनमें से एक है धागे की अंतराल को अनुकरण करना स्पिन इंतजार कर रहा है। चेतावनी यह है कि आपको अपने प्लेटफ़ॉर्म के लिए मानक स्पिन प्रतीक्षा तंत्र का उपयोग नहीं करना चाहिए क्योंकि वे स्मृति बाधाओं को पेश करेंगे। यदि आप जिस समस्या का निवारण करने का प्रयास कर रहे हैं वह स्मृति बाधा की कमी के कारण होता है (क्योंकि लॉक-फ्री रणनीतियों का उपयोग करते समय बाधाओं को सही करना मुश्किल होता है) तो मानक स्पिन प्रतीक्षा तंत्र केवल समस्या को मुखौटा कर देगा। इसके बजाय, उन बिंदुओं पर एक खाली लूप रखें जहां आप अपने कोड को एक पल के लिए रोकना चाहते हैं। यह एक समवर्ती बग को पुन: उत्पन्न करने की संभावना को बढ़ा सकता है, लेकिन यह एक जादू बुलेट नहीं है।

0

बग एक गतिरोध है, तो बस कार्यक्रम के बाद गतिरोध होता है डीबगिंग टूल (जैसे gdb या strace) संलग्न है, और अवलोकन जहां प्रत्येक धागा अटक है, अक्सर आप नीचे ट्रैक करने के लिए पर्याप्त जानकारी प्राप्त कर सकते हैं त्रुटि का स्रोत जल्दी से।

0

मल्टीथ्रेड कोड को डिबग करने में ध्यान देने के लिए मैंने कुछ डीबगिंग तकनीकों के साथ एक छोटा सा चार्ट बनाया है। चार्ट बढ़ रहा है, कृपया जोड़ने के लिए टिप्पणियां और सुझाव छोड़ दें। http://adec.altervista.org/blog/multithreading-debugging-chart/

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