2012-06-22 40 views
14

क्या आप कृपया मुझे बता सकते हैं कि सी ++ में एसआईजीएबीआरटी गलती का कारण क्या हो सकता है?एसआईजीएबीआरटी गलती का क्या कारण बनता है?

+2

अच्छा बिंदु !! में परिणाम होगा :) मैं देख कोशिश की कि वह अपने एक संकेत है कि प्रणाली के लिए संकलक से प्रक्रिया निरस्त करने के लिए भेज दिया जाता है कहते हैं, लेकिन मेरे संकलक नहीं कहता है कि कौन सा भाग इस असामान्य खड़ी कर रहा है व्यवहार, एन के लिए इस पर तीर, मैंने संभावित कारणों से पूछा। मेरा कोड 500 लाइन लंबा है। – user1444426

+0

@ user1444426 - इसे डीबग मोड में संकलित करें (-जी ++ के साथ), डीबीएक्स का उपयोग करें और इसे समस्या मिल जाएगी। –

+1

@Ecatmur, विकिपीडिया पेज वास्तव में वह सब उपयोगी नहीं है। यह सब कहता है कि 'abort' उस संकेत को उठाता है, लेकिन यह उससे परे नहीं जाता है। मुझे कभी-कभी मेरे कार्यक्रमों में 'सिगैबर्ट' सिग्नल मिलते हैं, लेकिन मैंने कभी * सीधे * abort' नहीं कहा है। –

उत्तर

8

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

10

प्रति Wikipedia,

SIGABRT ही प्रक्रिया के द्वारा भेजे गए है, जब यह abort libc समारोह, stdlib.h में परिभाषित कॉल कर रहा है। SIGABRT संकेत पकड़ा जा सकता है, लेकिन इसे अवरुद्ध नहीं किया जा सकता है; अगर सिग्नल हैंडलर लौटाता है तो सभी खुली धाराओं को बंद कर दिया जाता है और फिसल जाता है और कार्यक्रम समाप्त हो जाता है (उपयुक्त होने पर कोर डंपिंग)। इसका मतलब है कि abort कॉल कभी वापस नहीं आती है। इस विशेषता के कारण, अक्सर इसका उपयोग समर्थन पुस्तकालयों में घातक स्थितियों को इंगित करने के लिए किया जाता है, ऐसी परिस्थितियां जहां वर्तमान ऑपरेशन पूरा नहीं किया जा सकता है लेकिन मुख्य कार्यक्रम बाहर निकलने से पहले सफाई कर सकता है। इसका उपयोग तब किया जाता है जब कोई दावा विफल हो जाता है।

इसका मतलब है कि सीधे abort बुला यदि आपका कोड है नहीं है और न ही raise के माध्यम से ही SIGABRT संकेत भेजने, और आप किसी भी नाकाम रहने के दावे की जरूरत नहीं है, कारण होना चाहिए कि एक समर्थन पुस्तकालय (जो libc हो सकता है) एक आंतरिक त्रुटि का सामना करना पड़ा है। यदि आप अपने कार्यक्रम का विवरण प्रदान करते हैं तो हम संभावित कारणों का सुझाव दे सकते हैं। इससे भी बेहतर, यदि आप किसी कोर की जांच करते हैं या डीबगर में अपना प्रोग्राम चलाते हैं तो आपको एक स्टैक ट्रेस एकत्र करने में सक्षम होना चाहिए, जो दिखाएगा कि कौन सी लाइब्रेरी आपके प्रोग्राम को निरस्त कर देती है।

(यह भी संभव है कि आपके सिस्टम पर एक अन्य कार्यक्रम अपने कार्यक्रम SIGABRT भेज रहा है, लेकिन इस ज्यादातर मामलों में गायब संभावना नहीं है।)

3

व्यवहार में यह आम तौर पर ज़ोर मैक्रो से शुरू हो रहा है:

char* foo = NULL; 
assert(foo != NULL); 

SIGABRT

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