2012-01-12 7 views
5

क्या मैं लिनक्स पर कोर डंप में क्या कॉन्फ़िगर कर सकता हूं? मैं विंडोज मिनी-डंप की तरह कुछ प्राप्त करना चाहता हूं (ऐप क्रैश होने पर स्टैक फ्रेम के बारे में न्यूनतम जानकारी)। मुझे पता है कि आप ulimit का उपयोग कर कोर फाइलों के लिए अधिकतम आकार निर्धारित कर सकते हैं, लेकिन यह मुझे कोर के अंदर जाने वाले नियंत्रण को नियंत्रित करने की अनुमति नहीं देता है (यानी कोई गारंटी नहीं है कि अगर मैं 64kb तक सीमा निर्धारित करता हूं तो यह पिछले 16 पृष्ठों को डंप करेगा उदाहरण के लिए, ढेर)।न्यूनतम कोर डंप (केवल स्टैक ट्रेस + वर्तमान फ्रेम)

इसके अलावा, यदि संभव हो तो मैं इसे प्रोग्रामेटिक तरीके से (कोड से) में सेट करना चाहता हूं। मैंने man core द्वारा उल्लिखित /proc/PID/coredump_filter फ़ाइल को देखा है, लेकिन यह मेरे उद्देश्यों के लिए बहुत मोटे अनाज लगता है।

थोड़ा संदर्भ प्रदान करने के लिए: मुझे कई कारणों से छोटी कोर फाइलों की आवश्यकता है: मुझे कई (हजारों) ग्राहकों के लिए नेटवर्क पर उन्हें इकट्ठा करने की आवश्यकता है; इसके अलावा, ये छोटे कनेक्शन वाले एम्बेडेड डिवाइस हैं, और नेटवर्क कनेक्शन के लिए जीपीआरएस मोडेम हैं। तो ~ 200k से ऊपर कुछ भी सवाल से बाहर है।

संपादित करें: मैं एक एम्बेडेड डिवाइस पर काम कर रहा हूं जो लिनक्स 2.6.24 चलाता है। प्रोसेसर पावरपीसी है। दुर्भाग्य से, PowerPC-linux पल में breakpad में समर्थित नहीं है, तो गूगल breakpad एक विकल्प

+1

मुझे कोई जानकारी नहीं है, और उत्तर शायद कर्नेल स्रोत कोड के अंदर स्थित है (क्योंकि इससे संबंधित कोई विनिर्देश नहीं है)। तुमने क्यों पूछा? वर्तमान डिस्क के साथ, एक 64 एमबी कोर डंप सीमा अभी भी छोटी है, और शायद इसमें पर्याप्त जानकारी होगी। आपको 64kb जैसे छोटे मूल्य पर सीमा निर्धारित करने की आवश्यकता क्यों है। ? –

+3

Google ब्रेकपैड लिनक्स समेत सभी प्लेटफार्मों पर मिनीडंप लिखता है। –

+0

मैं पूछता हूं क्योंकि मैं एक एम्बेडेड डिवाइस का उपयोग कर रहा हूं, जिसमें एक छोटी फ्लैश डिस्क है और विशेष रूप से धीमी जीपीएस कनेक्शन डाउनलोड करने के लिए कनेक्शन है .. मैं इसे जितना संभव हो उतना छोटा होना चाहता हूं! –

उत्तर

5

मेरे पास नहीं है कि "हल" दो तरह से इस मुद्दे:

  1. मैंने SIGSEGV के लिए एक सिग्नल हैंडलर स्थापित किया है, और स्टैक ट्रेस मुद्रित करने के लिए बैकट्रैक/बैकट्रैक_सिम्बोल्स का उपयोग किया है। मैंने अपने कोड को गतिशील के साथ संकलित किया, इसलिए डीबग जानकारी को तोड़ने के बाद भी मुझे सार्थक नामों के साथ एक बैकट्रैक मिलता है (निष्पादन योग्य कॉम्पैक्ट को पर्याप्त रखते हुए)।
    मैंने डीबग जानकारी को तोड़ दिया और इसे एक अलग फ़ाइल में रखा, जिसे मैं strip का उपयोग करके कहीं सुरक्षित रखूंगा; वहां से, मैं add22line का उपयोग बैकट्रैस (पते) से सहेजी गई जानकारी के साथ करूँगा ताकि यह समझ सके कि समस्या कहां हुई। इस तरह मुझे केवल कुछ बाइट स्टोर करना है।
  2. वैकल्पिक रूप से, मैंने पाया कि मैं किसी भी स्मृति को डंप करने के लिए/proc/self/coredump_filter का उपयोग कर सकता हूं (इसकी सामग्री को "0" पर सेट करना): केवल थ्रेड और प्रो जानकारी, रजिस्ट्रार, स्टैकट्रैक इत्यादि कोर में सहेजे जाते हैं। this answer

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

अभी के लिए, मैं वहाँ 2 समाधान काफी खुश हूं (यह कुछ नहीं से बेहतर है ..) मेरा अगला चाल हो जाएगा:

  • देखना कितना मुश्किल PowerPC-linux के लिए बंदरगाह Breakpad होगा: पहले से ही पावरपीसी-डार्विन और i386-linux हैं .. यह कितना मुश्किल हो सकता है? :)
  • google-coredumper उपयोग करने के लिए चारों ओर वर्तमान ईएसपी केवल कुछ पृष्ठों (कि मुझे स्थानीय लोगों और मानकों को देना चाहिए) और चारों ओर डंप करने की कोशिश "& some_global" (है कि मुझे वैश्विक देना चाहिए)।
+0

हालांकि Google- coredumper काटना आसान होगा और विशिष्ट पृष्ठों/पतों को डंप करने के लिए 'WriteCoreDump' फ़ंक्शन को संशोधित करना होगा .. इसमें Powerpc के लिए कोई समर्थन नहीं है :( –

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