2010-02-12 17 views
13

जब भी मेरी प्रक्रिया दुर्घटनाग्रस्त हो जाती है तो मैं कोर डंप बनाना चाहता हूं। वर्तमान में मैं इस दृष्टिकोण का अनुसरण कर रहा हूं:लिनक्स में कोर डंप

  1. जीसीसी/जी ++ के "-g" का उपयोग करके प्रोग्राम का एक विशेष "डीबग" संस्करण बनाएं।
  2. निष्पादित करें "ulimit -c असीमित"
  3. अब जब भी प्रोग्राम क्रैश हो जाता है तो हमें कोर डंप मिलता है।

    • कोर डंप हमेशा बनाया जाना चाहिए:

लेकिन मैं चरणों ताकि की संख्या को कम करना चाहते हैं। भले ही यह "रिलीज" निर्माण हो। मैन्युअल रूप से कमांड को "ulimit -c unlimited" आदेश निष्पादित करने के लिए नहीं कहा जाना चाहिए।

  • वह कोर डंप का बैकट्रैक कॉल की फ़ाइल, फ़ंक्शन, लाइन नंबर देने में सक्षम होना चाहिए। यह मानव पठनीय रूप में ढेर का निशान है।
  • मैं प्रोग्राम को "-g" के साथ डीबग बिल्ड के रूप में बनाना नहीं चाहता हूं। या कम से कम इसमें कोई अन्य डिबगिंग जानकारी नहीं होनी चाहिए जिसे मानव पठनीय स्टैक ट्रेस बनाने की आवश्यकता नहीं है। क्योंकि यह कार्यक्रम का एक रिलीज निर्माण होगा।

    1. कैसे "रिलीज" एक कार्यक्रम के निर्माण में एक कोर डंप बनाने के लिए:
    2. तो मैं दो प्रश्न हैं?

    3. हमेशा। मैन्युअल रूप से "ulimit -c unlimited"
  • उत्तर

    7

    सामान्य समाधान -0 के साथ निर्माण करना और फ़ाइल को रिलीज़ करने से पहले डीबग जानकारी को बंद करना है। 'स्ट्रिप' कमांड की तलाश करें। आप फ़ाइल को डीबग जानकारी के साथ रखते हैं और ग्राहकों से मिलने वाले कोर डंप को डीबग करने के लिए इसका उपयोग करते हैं।

    यदि आप उपयोगकर्ता मशीन पर मानव पठनीय बैकट्रैक मुद्रित करना चाहते हैं तो आपको (कुछ) डीबग जानकारी के साथ बाइनरी वितरित करने की आवश्यकता होगी। glibc में 'backtrace()' फ़ंक्शन की तलाश करें।

    ध्यान दें कि कोर डंप बनाए जाएंगे (यदि उलिमिट उचित रूप से सेट किया गया है) भले ही आपकी बाइनरी में डीबग जानकारी न हो।

    कोर डंप के निर्माण को सुनिश्चित करने का सबसे अच्छा तरीका शायद आपकी बाइनरी को एक स्क्रिप्ट से निष्पादित करना है जो बाइनरी चलाने से पहले उलिमिट सेट करता है।

    -3

    यदि कोड एक रिलीज़ मोड/अत्यधिक अनुकूलित संस्करण है तो आपको शायद मानव रूप में एक सभ्य स्टैकट्रैक मिलेगा। -जी स्विच का उपयोग करें या एक स्टैकट्रैक पूरी तरह से करने के बारे में भूल जाओ ... आप दोनों नहीं हो सकता !! जो इस बिंदु पर वापस लाता है - ऐसा लगता है जैसे आप उत्पादन वातावरण में भी क्रैश करने के लिए कोड की उम्मीद कर रहे हैं ???

    आप कोड क्यों ठीक करने और सुनिश्चित करें कि यह काम करता है पहले नहीं है ... कोड बदबू आ रही है .... सूंघ सूंघ

    संपादित करें: ठीक है, मैं थोड़ा कठोर भर में आया हो सकता है उपरोक्त मेरी टिप्पणी में, मैं कठोर होने का इरादा नहीं रखता था ... पाठकों के लाभ के लिए, मैंने यहां पोस्ट किए गए किसी अन्य प्रश्न का एक लिंक शामिल किया है, और उस answer में मैंने एक स्टैक-ट्रेस बनाने के लिए संकेतों का उपयोग किया है और एक फ़ाइल पर रीडायरेक्ट करें।यह ओ पी के सवाल का सहायक हो और समस्या निवारण में उसे सहायता करेगा ...

    +0

    यह समझना महत्वपूर्ण है कि 'जी' और अनुकूलन के स्तर पूरी तरह से संबंधित नहीं हैं महत्वपूर्ण है। '-g' का अर्थ है कि डीबग जानकारी बाइनरी में जोड़ दी जाएगी। इसका मतलब यह नहीं है कि कोड अनुकूलित नहीं किया जाएगा। 'gcc -g -O3 ...' एक पूरी तरह से उचित बात है (समझने के साथ कि कोड डीबग करने के लिए थोड़ा कठिन हो सकता है)। –

    +0

    ठीक है, क्योंकि कभी-कभी दुर्घटनाओं को पुन: उत्पन्न करना बहुत कठिन होता है। और बग हमेशा अनुमानित नहीं होते हैं, है ना? उस समय मैं जानकारी खोना नहीं चाहता हूं। – Sabya

    +0

    ऑप्टिमाइज़ेशन के साथ भी, एक स्टैक ट्रेस आमतौर पर सही फ़ंक्शन देता है (यदि आवश्यक नहीं है तो सही रेखा)। यह आमतौर पर दूर नहीं है। कम से कम यह मेरा अनुभव है। – MarkR

    11
      कोर सीमा के बारे में
    • , आप setrlimit फोन करके सी में अपने आप यह कर सकते हैं।
    • एक जीएनयू (ग्लिबैक) या बीएसडी सिस्टम पर, आप backtrace और संबंधित सिस्टम कॉल पर कॉल करके बैकट्रैक प्राप्त कर सकते हैं। आपको addr2line (या इसकी कार्यक्षमता को डुप्लिकेट करके) फ़ंक्शन नामों में फ़ंक्शन पते में अनुवाद करना होगा।
    • बस -g का उपयोग न करें, आप अभी भी बैकट्रैक प्राप्त कर सकते हैं (सिवाय इसके कि इनलाइन फ़ंक्शंस दिखाई नहीं देंगे)।
    1
    1. एक "रिलीज" संस्करण और लिनक्स पर "डिबग" संस्करण के रूप में ऐसी कोई चीज नहीं है। "-g" का उपयोग करते समय आप डीबगिंग जानकारी के साथ एक प्रोग्राम बनाते हैं। आप इस जानकारी को पट्टी कर सकते हैं।

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

    हालांकि यदि आप assert() का उपयोग नहीं करते हैं तो कोई अंतर नहीं होगा।

    1. कोई उपयोगकर्ता अपनी प्रोफ़ाइल में ulimit -c असीमित सेट कर सकता है।

    2. कुछ अनुकूलन के साथ संकलित एक प्रोग्राम का बैकट्रैक अक्सर एक लाइन नंबर नहीं देता जो उपयोगी होता है।

    3. आप डिबगिंग जानकारी के साथ एक संस्करण बना सकते हैं और अपने संग्रह में डाल सकते हैं। फिर इसे पट्टी करें और अपने ग्राहकों को छीनने वाली बाइनरी वितरित करें। यदि कोई ग्राहक आपको कोर फ़ाइल देता है तो बस डिबगिंग जानकारी और ग्राहक से कोर फ़ाइल के साथ संस्करण का उपयोग करें।

    4. How to create a core dump in the "release" build of a program? यह आपकी ज़िम्मेदारी नहीं है, यह ओएस की ज़िम्मेदारी है।

    3

    आप कोशिश कर सकते हैं गूगल-coredumper:

    बहु अनुप्रयोगों से GDB पठनीय coredumps बनाने के लिए एक स्वच्छ उपकरण - जबकि कार्यक्रम चल रहा है। कॉर्डम्पर लाइब्रेरी को बिना किसी समाप्ति के चल रहे प्रोग्राम के कोर डंप बनाने के लिए अनुप्रयोगों में संकलित किया जा सकता है।

    http://sourceforge.net/projects/goog-coredumper/

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