2009-09-26 17 views
6

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

मुझे संदेह है कि समस्या एक सहमति समस्या है लेकिन मुझे यकीन नहीं है। मेरे पास स्रोत कोड और क्रैश डंप फ़ाइलों तक पहुंच है लेकिन मुझे नहीं पता कि समस्या को इंगित करने के लिए क्रैश डंप का उपयोग कैसे करें।

किसी भी सुझाव की बहुत सराहना की जाती है।

उत्तर

7

पहली बात के लिए देखने के लिए त्रुटि संदेश है कि आप जब कार्यक्रम दुर्घटनाओं प्राप्त है। यह अक्सर आपको बताएगा कि किस प्रकार की त्रुटि हुई। उदाहरण के लिए "विभाजन गलती" या "SIGSEGV" लगभग निश्चित रूप से इसका अर्थ है कि आपके प्रोग्राम ने एक पूर्ण या अन्यथा अमान्य सूचक का संदर्भ दिया है। यदि कार्यक्रम सी ++ में लिखा गया है, तो त्रुटि संदेश अक्सर आपको किसी भी अपरिपक्व अपवाद का नाम बताएगा।

यदि आपको त्रुटि संदेश नहीं दिखाई दे रहा है, तो प्रोग्राम को कमांड लाइन से चलाएं, या उसके आउटपुट को फ़ाइल में पाइप करें।

कोर फ़ाइल वास्तव में उपयोगी होने के लिए, आपको अनुकूलन के बिना और डिबगिंग जानकारी के बिना अपने प्रोग्राम को संकलित करने की आवश्यकता है। जीसीसी को निम्नलिखित विकल्पों की आवश्यकता है: -g -O0। (सुनिश्चित करें कि आपके निर्माण में कोई अन्य -O विकल्प नहीं है।बिंदु जहां दुर्घटना हुई देखने के लिए

gdb YOUR-APP COREFILE 

प्रकार where:)

एक बार जब आप मूल फ़ाइल है, तो यह gdb में खोलने के साथ। आप मूल रूप से एक सामान्य डीबगिंग सत्र में हैं - आप वैरिएबल की जांच कर सकते हैं, स्टैक को ऊपर और नीचे ले जा सकते हैं, थ्रेड और जो भी हो, के बीच स्विच कर सकते हैं।

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

शुभकामनाएं!

0

क्या आपका ऐप कोर फ़ाइल बनाता है? यदि ऐसा है, तो मैं इस समस्या को डीबग करने के लिए जीडीबी का उपयोग करूंगा।

9

यदि समस्या स्वयं को प्रकट करने में एक घंटे या उससे अधिक समय लेती है, तो यह एक स्मृति समस्या हो सकती है - शायद बाहर चलना, या शायद ट्रामलिंग (उदाहरण के लिए पहले से रिलीज़ हुई स्मृति का उपयोग करना)।

आप कहते हैं कि आपको क्रैश डंप फाइलें मिली हैं - यह कोर डंप है?

मान लें कि आप एक कोर डंप है, तो पहला कदम शायद आईएसपी नामों मुद्रित करने के लिए किया जाना चाहिए:

gdb program core 
> where 

यह आपको बताना चाहिए जहां कार्यक्रम था जब दुर्घटना हुई। और क्या उपलब्ध है इस पर निर्भर करता है कि सर्वर को कैसे संकलित किया गया था। यदि संभव हो, तो आपको डीबगिंग सक्षम के साथ पुन: संकलित करना चाहिए (यह जीसीसी के साथ '-g' ध्वज के साथ होगा)। इससे आपको स्टैक बैकट्रैक से अधिक जानकारी मिल जाएगी।

यदि आपकी समस्या स्मृति से संबंधित है, तो valgrind के साथ चलने पर विचार करें।

malloc() के डिबगिंग संस्करण के साथ निर्माण और चलाने पर भी विचार करें। एक डिबगिंग संस्करण मेमोरी दुर्व्यवहार का पता लगाएगा कि सामान्य संस्करण मिस - या क्रैश ऑन।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। सर्वर को डीबगिंग जानकारी के साथ संकलित किया गया है और जब यह दुर्घटनाग्रस्त हो जाता है तो कोर डंप बनाता है। सर्वर कई धागे शुरू करता है। जब भी धागे 200 से कम होते हैं तो सर्वर एक घंटे से थोड़ा अधिक समय तक काम करता रहता है लेकिन जब अनुरोधों की संख्या में वृद्धि पूल में धागे की संख्या को 300 तक बढ़ा देती है तो सर्वर बहुत जल्द क्रैश हो जाता है। क्या आप कृपया मुझे बताएं कि मॉलोक के डिबगिंग संस्करण का उपयोग करने से कैसे मदद मिल सकती है? धन्यवाद –

+0

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

+0

'200 धागे के तहत ठीक है; जल्द से जल्द 300 से अधिक दुर्घटनाएं; क्या आपने देखा है कि सर्वर कुछ संसाधन (शायद 200, शायद 256) के एक निश्चित आकार पूल आवंटित करता है और उस संसाधन के थकावट के लिए उचित रूप से जांच नहीं करता है। यह म्यूटेक्स, या सेमफोरस, या कुछ और जो स्मृति स्मृति दुरुपयोग को ट्रिगर कर रहा है का एक सेट हो सकता है। क्या आपके द्वारा लिखा गया सर्वर कोड है? क्या आपको काम पर धागे की संख्या सीमित करना चाहिए? –

5
gdb -c core.file exename 
bt 

यह exename मान लिया जाये कि डिबगिंग प्रतीकों के साथ बनाया गया था (और यह सभी गतिशील है निर्भरता पथ में हैं) है कि आप एक वापस ट्रेस मिल जाएगा। 'अप' और 'डाउन' आपको स्टैक में ऊपर और नीचे ले जायेगा, और p varname स्थानीय और पैरामीटर की जांच के लिए उपयोग किया जा सकता है।

तुम भी valgrind के तहत इसे चलाने की कोशिश कर सकते:

valgrind --tool=memcheck --leak-check=full exename