2010-10-12 29 views
5

कुछ सी ++ पुस्तकालय त्रुटि के मामले में abort() फ़ंक्शन को कॉल करते हैं (उदाहरण के लिए, एसडीएल)। इस मामले में कोई सहायक डीबग जानकारी प्रदान नहीं की जाती है। निरस्त कॉल पकड़ना और कुछ डायग्नोस्टिक लॉग आउटपुट लिखना संभव नहीं है। मैं इन पुस्तकालयों को पुनर्लेखन/पुनर्निर्माण के बिना वैश्विक स्तर पर इस व्यवहार को ओवरराइड करना चाहता हूं। मैं अपवाद फेंकना और इसे संभालना चाहता हूं। क्या यह संभव है?सी ++ निरस्त ओवरराइड

उत्तर

17

ध्यान दें कि abortSIGABRT सिग्नल बढ़ाता है, जैसे कि इसे raise(SIGABRT) कहा जाता है। तुम बहुत की तरह, एक संकेत हैंडलर इस स्थिति में कहा जाता हो जाता है कि स्थापित कर सकते हैं:

#include <signal.h> 

extern "C" void my_function_to_handle_aborts(int signal_number) 
{ 
    /*Your code goes here. You can output debugging info. 
     If you return from this function, and it was called 
     because abort() was called, your program will exit or crash anyway 
     (with a dialog box on Windows). 
    */ 
} 

/*Do this early in your program's initialization */ 
signal(SIGABRT, &my_function_to_handle_aborts); 

आप (कीड़े कि अपने सबसे अच्छे इरादों के बावजूद में रेंगना की वजह से कहते हैं, वे कर रहे हैं) abort कॉल्स को रोकने नहीं कर सकते, यह आपको कुछ और डीबगिंग जानकारी एकत्र करने की अनुमति दे सकता है। यह पोर्टेबल एएनएसआई सी है, इसलिए यह यूनिक्स और विंडोज़ और अन्य प्लेटफ़ॉर्म पर भी काम करता है, हालांकि आप निरंतर हैंडलर में जो भी करते हैं वह प्रायः पोर्टेबल नहीं होगा। ध्यान दें कि इस हैंडलर को भी कहा जाता है जब assert विफल रहता है, या यहां तक ​​कि अन्य रनटाइम फ़ंक्शंस द्वारा - कहें, अगर malloc ढेर भ्रष्टाचार का पता लगाता है। तो आपका प्रोग्राम उस हैंडलर के दौरान पागल स्थिति में हो सकता है। आपको स्मृति आवंटित नहीं करना चाहिए - यदि संभव हो तो स्थैतिक बफर का उपयोग करें। आपको आवश्यक जानकारी एकत्र करने के लिए बस न्यूनतम करें, उपयोगकर्ता को एक त्रुटि संदेश प्राप्त करें, और छोड़ दें।

कुछ प्लेटफ़ॉर्म उनके abort कार्यों को और अनुकूलित करने की अनुमति दे सकते हैं। उदाहरण के लिए, विंडोज़ पर, विज़ुअल सी ++ में एक फ़ंक्शन _set_abort_behavior है जो आपको यह चुनने देता है कि उपयोगकर्ता को संदेश प्रदर्शित किया गया है या नहीं, और क्रैश डंप एकत्र किए जाते हैं या नहीं।

+0

क्या होगा यदि my_function_to_handle_aborts फेंकता है?) –

+0

@ पावेल: यह कार्यान्वयन-परिभाषित है, यानी पोर्टेबल नहीं है। असल में, आपको सी की विशेषताओं का उपयोग करने में सक्षम होने की गारंटी दी जाती है, लेकिन हो सकता है कि आप C++ सुविधाओं का उपयोग करने में सक्षम न हों जैसे वैरिएबल घोषित करना, 'नया', 'हटाएं', या अपवाद फेंकना। कई कार्यान्वयन में, हालांकि यह काम कर सकता है। साथ ही, समारोह में सी लिंकेज होना चाहिए - मैंने जवाब संपादित किया है, लेकिन विंडोज या यूनिक्स पर कोई फर्क नहीं पड़ता है। – Doug

+0

विस्तृत उत्तर के लिए धन्यवाद। –

0

आप अपना खुद का लिखने का प्रयास कर सकते हैं और लिंकर को std :: abort के स्थान पर कॉल करने के लिए प्राप्त कर सकते हैं। मुझे यकीन नहीं है कि यह संभव है हालांकि।

3

लिनक्स पर मैन पेज के अनुसार, abort() एक सिग्नल हैंडलर द्वारा पकड़ा जा सकता है कि प्रक्रिया के लिए एक SIGABRT उत्पन्न करता है। संपादित करें: बेन ने पुष्टि की है कि यह विंडोज़ पर भी संभव है - नीचे अपनी टिप्पणी देखें।

+1

विजुअल सी ++ का निरस्त समारोह भी करता है। शून्य abort() - SIGABRT उठाकर वर्तमान कार्यक्रम को निरस्त करें उद्देश्य: एक निरस्त संदेश मुद्रित करें और SIGABRT सिग्नल बढ़ाएं। यदि उपयोगकर्ता ने एक निरंतर हैंडलर रूटीन परिभाषित नहीं किया है, तो सफाई के बिना 3 की निकास स्थिति के साथ कार्यक्रम को समाप्त करें।

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