2013-05-22 13 views
7

जब मेरा एप्लिकेशन सेगमेंटेशन गलती से क्रैश हो जाता है तो मैं सिस्टम से कोर डंप प्राप्त करना चाहता हूं। मुझे लगता है कि हाथलिनक्स: सेगमेंटेशन गलती को संभालना और कोर डंप प्राप्त करना

ulimit -c unlimited 

से पहले कॉन्फ़िगर करके मैं भी अपने आवेदन लॉग में एक संकेत है कि एक विभाजन गलती हुई है करना चाहते हैं करते हैं। मैं sigaction() का उपयोग कर ऐसा करता हूं। यदि मैं ऐसा करता हूं, तो सिग्नल अपने डिफ़ॉल्ट हैंडलिंग तक नहीं पहुंचता है और कोर डंप सहेजा नहीं जाता है।

मेरे सिस्टम सिग्नल हैंडलर से एक ही समय में सिस्टम कोर को एक लॉग लाइन कैसे डंप कर सकता है?

उत्तर

1

उत्तर: ध्वज SA_RESETHAND के साथ सिग्नेशन सेट करें और केवल हैंडलर से वापस आएं। एक ही निर्देश फिर से होता है, जिससे सेगमेंटेशन गलती फिर से होती है और डिफ़ॉल्ट हैंडलर का आविष्कार होता है।

+0

क्या आप विस्तृत कर सकते हैं? – Short

+0

मुझे डर है कि मैं नहीं कर सकता। – shoosh

+1

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

5
  1. अपने कस्टम लॉगिंग फ़ंक्शन को कॉल करने के लिए SIGSEGV के लिए डिफ़ॉल्ट सिग्नल हैंडलर को ओवरराइट करें।
  2. लॉग इन करने के बाद, डिफ़ॉल्ट हैंडलर को पुनर्स्थापित और ट्रिगर करें जो कोर डंप बनाएगा।

    void sighandler(int signum) 
    { 
        myLoggingFunction(); 
    
        // this is the trick: it will trigger the core dump 
        signal(signum, SIG_DFL); 
        kill(getpid(), signum); 
    } 
    
    int main() 
    { 
        signal(SIGSEGV, sighandler); 
    
        // ... 
    } 
    

    एक ही विचार भी sigaction साथ काम करना चाहिए:

यहाँ signal का उपयोग कर एक नमूना कार्यक्रम है।

स्रोत: How to handle SIGSEGV, but also generate a core dump

+0

सिग्नल को सिग्नल सेट करने के लिए मेरे लिए क्या काम करता था (साइनम, एसआईजीडीएफएल); और संकेत हैंडलर वापसी करते हैं। – Vincent

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