मैं एक अप्रतिबंधित / बेतरतीब ढंग से बग को ठीक करने के लिए कैसे संपर्क करूं?


11

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

समयबद्ध तरीके से मुद्दे को खोजने में कोई सुझाव? मैं यहां रणनीति बनाने के लिए कह रहा हूं।


4
उन स्थितियों के लिए कोड की जांच शुरू करें जो इस बग को होने देंगी (इसके बजाय इसे दूसरे तरीके से करने की बजाय)
इमरान उमर बुख़्श

जवाबों:


20

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

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

अब, एक बार आप विशेषता गए संभावनाओं क्या गलत हो सकता है, यह के समय सुनिश्चित करें कि आप डेटा आप कोशिश करते हैं और पता लगाने के लिए क्या करने की जरूरत है बनाने के लिए किया था जाने गलत।

  • समस्या क्षेत्रों के आसपास विपुल लॉगिंग का उपयोग करें। यह एक ऐसी जगह है जहां Log4J या Log4Net जैसे उपकरण वास्तव में चमक सकते हैं। वह लॉगिंग ढाँचा, और उसके जैसे अन्य, आपको किसी अन्य चीज़ के लिए शोर को कम करते हुए कुछ श्रेणियों के लिए लॉगिंग को चालू करने की अनुमति देता है - सभी एक कॉन्फ़िगरेशन फ़ाइल को बदलकर। यदि आप संदेह करते हैं तो संभवतः समस्या हो सकती है, यह पता लगाने के लिए आप नए लॉगिंग स्टेटमेंट को प्रस्तुत करना चाहते हैं। यह भी सुनिश्चित करें कि आपके HTTP एक्सेस लॉग में वह सभी जानकारी है जो आप प्रत्येक अनुरोध के बारे में चाहते हैं (कुकीज़, http हैडर पैरामीटर, आदि)।
  • समस्या का अनुकरण करने का प्रयास। चूंकि यह छिटपुट रूप से होता है, उस समय सर्वर पर लोड कितना होता है? क्या आप भाषाओं के मिश्रण से एक साथ कई अनुरोधों से प्रभावित हो रहे हैं? यदि हां, तो अपने परीक्षण वातावरण में उस तरह के भार का अनुकरण करने का प्रयास करें। JMeter के समान एक उपकरण वह हो सकता है जिसकी आपको आवश्यकता है। आप अपने नकली ग्राहकों के लिए आईपी पते को बिगाड़ने में सक्षम होना चाहते हैं। याद रखें कि आईपी पते को अलग कर दिया जाता है ताकि आप यह पता लगा सकें कि पता के पहले दो खंडों के आधार पर आईपी किस देश / क्षेत्र में है।
  • समस्या आपके परीक्षण वातावरण में छिटपुट के रूप में होगी, लेकिन जैसा कि आप अपने वास्तविक कारण में संकीर्ण हो जाते हैं, आप परिणामों को तिरछा कर सकते हैं ताकि यह अधिक बार ऐसा हो सके जैसे कि यह जंगली में होता है। इसके अतिरिक्त, आप लॉग फ़ाइलों की अधिक आसानी से समीक्षा कर सकते हैं और उनसे सीखने का प्रयास कर सकते हैं।
  • यह एक पुनरावृत्त प्रक्रिया है, इसलिए धैर्य रखें। आपको लगता है कि बग के प्रकार को पुन: उत्पन्न करने के लिए आपको प्रेरित करना होगा, लॉग की जांच करें, और जो आप पाते हैं उसके आधार पर अपने परीक्षणों को परिष्कृत करें। महत्वपूर्ण बात समस्या की पहचान करना है , इसलिए कुछ सरल सुधार करने के लिए आग्रह का विरोध करें जो केवल वास्तविक समस्या को कम अक्सर बना सकते हैं।

अंत में, एक बार जब आप समस्या को उस बिंदु तक सीमित कर देते हैं, जहां आप जानते हैं कि इसे कैसे पुन: उत्पन्न करना है, और इसके कारण क्या हैं, तो कोड में समस्या को मजबूर करने के लिए सबसे छोटा स्वचालित परीक्षण लिखें। यदि आपने समस्या को एक कक्षा तक सीमित कर दिया है, या एक जोड़ी कक्षाएं सही ढंग से काम नहीं कर रही हैं, तो उस स्तर पर इसे पुन: प्रस्तुत करें। आपको इसे करने के लिए 100 थ्रेड स्पान नहीं करने चाहिए, बस सबसे छोटा परीक्षण करना चाहिए जिससे समस्या 100% हो सकती है।

अब आप इसे ठीक कर सकते हैं, और उचित रूप से आश्वस्त रहें कि यह आपको फिर से काटने के लिए वापस नहीं आएगा।


10

बग अपूरणीय नहीं है। आपको अभी तक यह पता नहीं चला है कि इसे अभी तक कैसे पुन: पेश किया जाए।

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

मुझे पता है कि यह शब्दार्थ की तरह लग सकता है लेकिन यह मानसिक रूप से अपने आप को यह बताने के लिए आश्वस्त कर रहा है।

यह बहुत कठिन है और यह पता लगाने के लिए निराशाजनक है कि बग को कैसे फिर से संगठित करना है जो केवल जटिल दौड़ स्थितियों या इस तरह से होता है।

इसे खोजने के तरीके के रूप में, मैं उन स्थानों पर एप्लिकेशन में कुछ लॉगिंग को चालू / जोड़ दूंगा जो आपको अधिक जानकारी दे सकते हैं।

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

उम्मीद है कि आप लीड हासिल कर पाएंगे।


यहां तक ​​कि रैंडम () कॉल वास्तव में यादृच्छिक नहीं हैं जब तक कि वे एक हार्डवेयर सफेद शोर जनरेटर से उत्पन्न न हों। वे psuedo-random हैं, जिसका अर्थ है कि संख्याओं को गणितीय रूप से यथासंभव यादृच्छिक क्रम में वितरित किया जाता है। लेकिन यदि आप समान "बीज" मूल्य से शुरू करते हैं, तो आपको हर बार एक ही जवाब मिलेगा।
बेरिन लोरिट्श

1
@ बियर: मुझे पता है।
गिल्स

+1 के लिए "आपको अभी तक यह पता नहीं चला है कि इसे कैसे पुन: पेश किया जाए।" सभी बग्स का मूल कारण है वरना ऐसा नहीं होता।
माइक एस

1
इसे रैंडम () से दूर नहीं होना पड़ता है, जो चीजें समय पर निर्भर होती हैं, विशेष रूप से उन चीजों को जिनमें साझा संसाधन के लिए अनुचित पहुंच शामिल है, पुन: पेश करने के लिए बहुत कठिन हो सकती है।
लोरेन Pechtel

2
@ गिल्स: सिवाय वे किसी भी चीज़ पर नियतात्मक नहीं हो सकते हैं जो आप उचित रूप से माप सकते हैं। (कहो, वास्तव में जब कुछ अन्य कार्य जारी किया गया है तो यह समय का टुकड़ा है।)
लोरेन Pechtel

5

आप अपने कोड में उन स्थानों को खोजने का प्रयास कर सकते हैं, जहाँ आप पहचान सकते हैं कि समस्या उत्पन्न हुई (उदाहरण के लिए एक विधि में असंगत पैरामीटर), अपने कोड में चेक जोड़ें और उन्हें डीबग लॉग में अतिरिक्त जानकारी जोड़ने दें (जैसे स्टैक ट्रेस, ऑब्जेक्ट) सत्र में जोड़ा गया, आदि)

इसे थोड़ा सा भाग्य के साथ करते हुए आप घटनाओं के बारे में जानकारी प्राप्त कर सकते हैं और समस्या पर वापस आ सकते हैं।


2

स्वचालन को मदद करनी चाहिए, अगर यह वही कदम है जो कभी-कभी विफल होता है, तो उसे स्वचालित करें और इसे लूप में डालें। 50,000 बार चलाएं और ऐसा होने की बहुत संभावना है।


घटना यादृच्छिक नहीं है, यह सिर्फ यादृच्छिक लगता है। ऐसा करने से यह प्रकट हो सकता है, लेकिन यह आपको बहुत कम जानकारी देगा कि यह क्यों दिखाई दिया।
जोश के

1
@ जोश - अगर वह इसे पुन: पेश करने में सक्षम नहीं है, तो यह उदाहरण के लिए डिबग प्रतीकों के साथ एक स्टैक ट्रेस करने और प्राप्त करने का एक अच्छा तरीका हो सकता है। मुझे पता है कि यह एक महान पहला कदम है - इसे पहली बार देखते हुए
किरन जॉनस्टोन

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

@ जोश - मेरा असली-दुनिया का अनुभव मुझे एक बग की जांच / फिक्सिंग में सबसे मूल्यवान चीज बताता है, इसे पहली बार देख रहा हूं। चाहे आप टाइमिंग के साथ कुछ देख सकते हैं, स्टैक ट्रेस, लॉग में कुछ, या कुछ और। जहां संभव हो, एक लूप में परीक्षण किए गए बेतरतीब ढंग से होने वाले मुद्दों ने मुझे बहुत जल्दी प्राप्त कर लिया है। यदि आपके पास एक अलग विचार है, तो इसे क्रिसमस के उत्तर के रूप में पोस्ट करें - यह एक वैध तरीका और एक वैध उत्तर है।
कीरन जॉनस्टोन

मैं असहमत हूं, और मेरा मानना ​​है कि बेरिन का जवाब इसे सुलझाने के बारे में जाने का सही तरीका है।
जोश के

1

उन स्थितियों को पिन करने के लिए पैटर्न खोजने की कोशिश करें जो इस समस्या को स्वयं प्रकट करते हैं। आपको अपने कोड के उन हिस्सों की ओर संकेत करना चाहिए जो विफल होते हैं (या असंगत व्यवहार करते हैं)।


कोई गंदगी नहीं ..............
theringostarrs

0

आप पता लगा सकते हैं जब समस्या है उत्पन्न हो रही? यदि हां, तो क्या आप उस बिंदु पर सिस्टम की स्थिति के बारे में विश्वसनीय रूप से जानकारी डंप कर सकते हैं?

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

यह ऐसा कोई प्रतिस्थापन नहीं है जो अन्य लोगों ने सुझाया है (आप अभी भी इस कारण की आवश्यकता पर जा रहे हैं कि कोड आपके द्वारा देखे जा रहे राज्य में कैसे पहुंच सकता है), लेकिन जब तक आप बग पर बग को पुन: पेश नहीं कर सकते, यह एक अच्छा विचार है कि उन अवसरों को बर्बाद न करें जहां यह दिखाई देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.