c कैसे सी सी डीबगिंग और बेस्ट प्रैक्टिस




apache debugging (6)

मैंने एक अपाचे मॉड्यूल सी में लिखा है, कुछ शर्तों के तहत, मैं इसे सिग्फ़ॉल्ट से प्राप्त कर सकता हूं, लेकिन मुझे यह नहीं पता है कि क्यों इस बिंदु पर, यह मेरा कोड हो सकता है, यह इस तरह से हो सकता है कि मैं प्रोग्राम को संकलित कर रहा हूं, या यह ओएस पुस्तकालय में एक बग हो सकता है (सीओफ़फॉल्ट एक कॉल के दौरान डलपें () के लिए होता है)

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

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

संपादित करें: बस स्पष्ट करने के लिए, मैं सिडीस और डीएमकेबी के इनपुट को धन्यवाद देना चाहता हूं। मैंने अपाचे की मार्गदर्शिका पर एक नज़र डाला था और डेलोपैन (और डीएसएलएसएम और डेलक्लोसे) से काफी परिचित हूं। मेरा मॉड्यूल अधिकांश भाग के लिए काम करता है (यह कोड की लगभग 3k लाइनों पर है और जब तक मैं इस एक अनुभाग को सक्रिय नहीं करता, तब तक चीजें ठीक लगती हैं।)

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


बहुत सामान्य सलाह:

  • उस बैक्रेस पर फिर से देखें क्या आप नियंत्रित कोड में स्टैक फ़्रेमों में से कोई भी हैं? यदि हां, तो किन रेखा है, और वहां क्या हो रहा है?

  • क्या आप जानते हैं कि dlopen() क्या करता है? यदि मैनुअल नहीं पढ़ा यदि बैकस्ट्र्रेस में आपका कोई भी कोड शामिल नहीं है, तो Apache आपका कोड लोड करने का प्रयास करता है, यह संभवतः असफल हो सकता है। क्या आप वाकई सही संकलक विकल्प के साथ मॉड्यूल का निर्माण कर चुके हैं?

  • प्रभावी डीबगिंग को आपके पर्यावरण और उपकरण जानना आवश्यक है। सिडीस की सलाह यहां अच्छी है

  • यदि आप अन्य रास्तों पर फंस रहे हैं, तो जांच लें कि आप एक तुच्छ मॉड्यूल लिख सकते हैं, लोड कर सकते हैं और चला सकते हैं। शायद इस विषय पर आप लगभग किसी भी दस्तावेज में इसका एक उदाहरण पा सकते हैं।

डेव का स्पष्टीकरण: शुरुआती और विशेषज्ञ के बीच एक कठिन स्थान हो सकता है।

क्या आप अपमानजनक कोड में लाइब्रेरी में बुला रहे हैं जो आप कहीं और का उपयोग नहीं करते हैं? हो सकता है कि लोडर पथ केवल उस संसाधन के लिए गड़बड़ हो गया है

एक तरफ से मैं सिर्फ सलाह के बारे में हूं माफ़ कीजिये।

NB: मुझे डेविड जे एगंस की पुस्तक डिबगिंग पिछले वर्ष पढ़ने का अवसर था। यह सॉफ़्टवेयर विशिष्ट नहीं है, लेकिन यह एक अच्छा पढ़ा है, और उपयोगी भी है , भले ही आप पहले से ही बहुत अच्छे डीबगर हैं।


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


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

डेव के स्पष्टीकरण के बाद संपादित करें:

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


तथ्य यह है कि यह डलप्पन () कॉल पर असफल हो रहा है मुझे कुछ संदेह लगता है साझा वस्तु खोलने का प्रयास करते समय कई चीजें गलत हो सकती हैं; लेकिन उनमें से कोई भी एक गलती का कारण नहीं होना चाहिए

एक अपवाद जिसके बारे में मैं सोच सकता हूँ तो एक ऐसा पुस्तकालय आरम्भ करने में समस्या है I उस आधार पर, मैं कुछ चीजों का सुझाव दूंगा जो आप अधिक जानकारी प्राप्त करने की कोशिश कर सकते हैं।

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

हालांकि मैंने बहुत सारे सामान्य प्रयोजन डिबगिंग सुझावों की पेशकश नहीं की है, मुझे आशा है कि यहाँ कुछ उपयोगी हो सकता है।


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

यह चिंताजनक है लेकिन चौंकाने वाला नहीं है कि आप वालग्रिंड के साथ आसानी से बग पुन: उत्पन्न नहीं कर सकते।

सही झंडे के साथ संकलन के बारे में, दोनों valgrind और gdb आपको अधिक बेहतर जानकारी देगा यदि आप -g -O0 साथ सब कुछ संकलित करते हैं जीसीसी मैन पेज पर दावों पर विश्वास न करें जो gcc -g -O काफी अच्छा है; यह नहीं है- यहां तक ​​कि -O भी ऑप्टिमाइज़र द्वारा स्रोत कोड में चर को समाप्त करने का कारण होगा।


हमारे गैर सीएस छात्रों (अर्थात् इलेक्ट्रिकल इंजीनियरिंग, गणित, भौतिक छात्रों) मैं प्रोग्रामिंग व्याख्यान "प्रोग्रामिंग का अभ्यास" में कर्नेलघन से सुझाता हूं। यह अच्छी तरह से कुछ बुनियादी अवधारणाओं को बचाता है जो देवत्व को सहायता देते हैं (जैसे परीक्षण और यहां यह आता है: डीबगिंग)।

यदि आप पहले से ही प्रोग्रामर अनुभव कर रहे हैं, तो यह संभवतः आपके लिए बुनियादी है। तो मेरे पास सिर्फ एक और ज़ेन कहावत है: "अनुभव के माध्यम से छानने की बुद्धि व्यर्थ है"।

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





valgrind