ios - EXC_BAD_ACCESS संकेत प्राप्त हुआ




cocoa-touch (20)

डिवाइस पर एप्लिकेशन को तैनात करते समय, प्रोग्राम निम्न त्रुटियों के साथ कुछ चक्रों के बाद छोड़ दिया जाएगा:

Program received signal: "EXC_BAD_ACCESS".

कार्यक्रम आईफोन सिम्युलेटर पर किसी भी मुद्दे के बिना चलता है, जब तक मैं एक समय में निर्देशों के माध्यम से कदम उठाता हूं तब तक यह डीबग और रन भी करेगा। जैसे ही मैं इसे फिर से चलाने देता हूं, मैं EXC_BAD_ACCESS सिग्नल को दबा दूंगा।

इस विशेष मामले में, यह एक्सेलेरोमीटर कोड में एक त्रुटि हुई। यह सिम्युलेटर के भीतर निष्पादित नहीं होगा, यही कारण है कि उसने कोई त्रुटि नहीं फेंक दी। हालांकि, यह डिवाइस पर तैनात एक बार निष्पादित होगा।

इस प्रश्न के अधिकांश उत्तर सामान्य EXC_BAD_ACCESS त्रुटि से निपटते हैं, इसलिए मैं इसे डरावनी खराब पहुंच त्रुटि के लिए कैच-सब के रूप में खोल दूंगा।

EXC_BAD_ACCESS को आम तौर पर अवैध स्मृति पहुंच के परिणामस्वरूप फेंक दिया जाता है। आप नीचे दिए गए उत्तरों में अधिक जानकारी प्राप्त कर सकते हैं।

क्या आपने पहले EXC_BAD_ACCESS सिग्नल का सामना किया है, और आपने इसका कैसे सामना किया?


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


2010 डब्ल्यूडब्ल्यूडीसी वीडियो सेब डेवलपर प्रोग्राम में किसी भी प्रतिभागियों के लिए उपलब्ध हैं। एक महान वीडियो है: "सत्र 311 - इंस्ट्रूमेंट्स के साथ उन्नत मेमोरी विश्लेषण" जो उपकरणों में लाशों का उपयोग करने और अन्य स्मृति समस्याओं को डीबग करने के कुछ उदाहरण दिखाता है।

लॉगिन पेज के लिंक के लिए HERE क्लिक HERE


EXC_BAD_ACCESS का एक प्रमुख कारण रिलीज़ ऑब्जेक्ट तक पहुंचने का प्रयास कर रहा है।

इसका निवारण कैसे करें, यह जानने के लिए, इस दस्तावेज़ को पढ़ें: DebuggingAutoReleasePool

भले ही आपको नहीं लगता कि आप "ऑटो-रिलीज ऑब्जेक्ट्स जारी कर रहे हैं", यह आपके लिए लागू होगा।

यह विधि बेहद अच्छी तरह से काम करती है। मैं हर समय महान सफलता के साथ इसका उपयोग करता हूं !!

संक्षेप में, यह बताता है कि कोको के NSZombie डीबगिंग क्लास और कमांड लाइन "malloc_history" टूल का उपयोग कैसे करें, यह पता लगाने के लिए कि आपके कोड में वास्तव में किस ऑब्जेक्ट को एक्सेस किया गया है।

पक्षीय लेख:

रनिंग इंस्ट्रूमेंट्स और लीक की जांच करने से EXC_BAD_ACCESS की समस्या निवारण में मदद नहीं मिलेगी। मुझे यकीन है कि स्मृति लीक के पास EXC_BAD_ACCESS के साथ कुछ लेना देना नहीं है। रिसाव की परिभाषा एक ऐसी वस्तु है जिसे आपके पास अब तक पहुंच नहीं है, और इसलिए आप इसे कॉल नहीं कर सकते हैं।

अद्यतन: अब मैं लीक डीबग करने के लिए इंस्ट्रूमेंट्स का उपयोग करता हूं। एक्सकोड 4.2 से, उत्पाद-> प्रोफ़ाइल चुनें और जब उपकरण लॉन्च हों, तो "लाश" चुनें।


XCode 4+ में स्थिर विश्लेषक है , जो होने से पहले EXC_BAD_ACCESS अपवादों को पकड़ने के लिए एक और तरीका है।

उत्पाद के साथ स्थिर विश्लेषक चलाएं> विश्लेषण (शिफ्ट + सेमीडी + बी)। विश्लेषक द्वारा जेनरेट किए गए किसी भी संदेश पर क्लिक करने से आप अपने स्रोत पर एक आरेख ओवरले करेंगे जो अपमानजनक वस्तु के रखरखाव / रिलीज़ के अनुक्रम को दिखाता है।


आशा है कि जब आप कर लेंगे तो आप 'स्ट्रिंग' जारी कर रहे हैं!


एक EXC_BAD_ACCESS सिग्नल सिस्टम कॉल में अमान्य पॉइंटर पास करने का परिणाम है। मुझे ओएस एक्स पर एक परीक्षण कार्यक्रम के साथ आज पहले एक मिला - मैं एक अनियमित चर को pthread_join() में पास कर रहा था, जो पहले के टाइपो के कारण था।

मैं आईफोन विकास से परिचित नहीं हूं, लेकिन आपको अपने सभी बफर पॉइंटर्स को दोबारा जांचना चाहिए कि आप सिस्टम कॉल में जा रहे हैं। अपने कंपाइलर के चेतावनी स्तर को हर तरह से क्रैंक करें (जीसीसी के साथ, -Wall और -Wextra विकल्पों का उपयोग करें)। जितना संभव हो सिम्युलेटर / डीबगर पर कई निदान सक्षम करें।


जब आपके पास अनंत रिकर्सन होता है, तो मुझे लगता है कि आपको यह त्रुटि भी मिल सकती है। यह मेरे लिए एक मामला था।


पूरा जवाब नहीं है, लेकिन एक विशिष्ट स्थिति जहां मुझे यह प्राप्त हुआ है, उस वस्तु को एक्सेस करने का प्रयास करते समय 'मृत्यु हो गई' क्योंकि मैंने ऑटोरेलीज का उपयोग करने की कोशिश की:

netObjectDefinedInMyHeader = [[[MyNetObject alloc] init] autorelease];

तो उदाहरण के लिए, मैं वास्तव में इसे 'अधिसूचित' करने के लिए एक वस्तु के रूप में पास कर रहा था (इसे श्रोता, पर्यवेक्षक, जो भी मुहावरे आप पसंद करते हैं) के रूप में पंजीकृत किया गया था लेकिन अधिसूचना भेजी जाने के बाद यह पहले से ही मर चुका था और मुझे EXC_BAD_ACCESS मिल जाएगा। इसे [[MyNetObject alloc] init] बदलना [[MyNetObject alloc] init] और इसे बाद में जारी करना उचित हल करने के लिए त्रुटि को हल किया गया।

ऐसा होने का एक अन्य कारण उदाहरण के लिए है यदि आप किसी ऑब्जेक्ट में पास करते हैं और इसे स्टोर करने का प्रयास करते हैं:

myObjectDefinedInHeader = aParameterObjectPassedIn;

बाद में जब myObjectDefinedInHeader तक पहुंचने का प्रयास किया जा रहा है तो आपको परेशानी हो सकती है। का उपयोग करते हुए:

myObjectDefinedInHeader = [aParameterObjectPassedIn retain];

हो सकता है कि आपको क्या चाहिए निस्संदेह ये कुछ उदाहरण हैं जो मैंने भाग लिया है और अन्य कारण भी हैं, लेकिन ये छिपी साबित हो सकते हैं इसलिए मैं उनका उल्लेख करता हूं। सौभाग्य!


बस जोड़ने के लिए

Lynda.com एक शानदार डीवीडी कहा जाता है

आईफोन एसडीके आवश्यक प्रशिक्षण

और अध्याय 6, पाठ 3 EXEC_BAD_ACCESS के बारे में है और लाश के साथ काम कर रहा है।

मेरे लिए यह समझना बहुत अच्छा था, न सिर्फ त्रुटि कोड बल्कि मैं जारी वस्तु पर अधिक जानकारी प्राप्त करने के लिए लाश का उपयोग कैसे कर सकता हूं।


मुझे objc_exception_throw पर ब्रेकपॉइंट सेट करने के लिए उपयोगी लगता है। जब आप EXC_BAD_ACCESS प्राप्त करते हैं तो डीबगर को तोड़ना चाहिए।

DebuggingTechniques यहां निर्देश मिल सकते हैं


मुझे एहसास है कि यह कुछ समय पहले पूछा गया था, लेकिन इस धागे को पढ़ने के बाद, मुझे एक्सकोड 4.2 के लिए समाधान मिला: उत्पाद -> योजना संपादित करें -> डायग्नोस्टिक टैब -> ज़ोंबी ऑब्जेक्ट्स सक्षम करें

मुझे एक हटाए गए ऑब्जेक्ट पर एक संदेश भेजने में मदद मिली।


मुझे बस यह समस्या थी। मेरे लिए कारण कोरडाटा प्रबंधित ऑब्जेक्ट उत्तर को बाद में किसी अन्य स्थान से पढ़ने की कोशिश कर रहा था।


मेरे अनुभव में, यह आमतौर पर एक अवैध स्मृति पहुंच के कारण होता है। यह सुनिश्चित करने के लिए कि वे प्रारंभ किए गए हैं, सभी पॉइंटर्स, विशेष रूप से ऑब्जेक्ट पॉइंटर्स देखें। सुनिश्चित करें कि आपकी MainWindow.xib फ़ाइल, यदि आप एक का उपयोग कर रहे हैं, तो सभी आवश्यक कनेक्शनों के साथ ठीक से सेट अप किया गया है।

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


मैं EXC_BAD_ACCESS से कैसे निपटता हूं

कभी-कभी मुझे लगता है कि जब एक EXC_BAD_ACCESS त्रुटि फेंक दी जाती है तो xcode मुख्य.एम कक्षा में त्रुटि दिखाएगा जहां दुर्घटना होती है (कभी-कभी)।

उस समय हम एक्सकोड में एक असाधारण ब्रेकपॉइंट सेट कर सकते हैं ताकि जब अपवाद पकड़ा जाता है तो ब्रेकपॉइंट रखा जाएगा और सीधे उपयोगकर्ता को अंतरंग करेगा कि उस पंक्ति में दुर्घटना हुई है


मैं पिछले चार घंटों के लिए इस त्रुटि को हल करने के लिए डीबगिंग कर रहा हूं, और कोड को दोबारा कर रहा हूं। उपरोक्त एक पोस्ट ने मुझे समस्या देखने के लिए प्रेरित किया:

पहले संपत्ति:

startPoint = [[DataPoint alloc] init] ;
startPoint= [DataPointList objectAtIndex: 0];
x = startPoint.x - 10; // EXC_BAD_ACCESS

संपत्ति के बाद:

startPoint = [[DataPoint alloc] init] ;
startPoint = [[DataPointList objectAtIndex: 0] retain];

अलविदा EXC_BAD_ACCESS

अपने जवाब के लिए आपको बहुत बहुत धन्यवाद। मैं पूरे दिन इस समस्या से जूझ रहा हूं। तुम कमाल हो!


मैं पिछले चार घंटों के लिए इस त्रुटि को हल करने के लिए डीबगिंग कर रहा हूं, और कोड को दोबारा कर रहा हूं। उपरोक्त एक पोस्ट ने मुझे समस्या देखने के लिए प्रेरित किया:

पहले संपत्ति: startPoint = [[डेटापॉइंट alloc] init]; startPoint = [DataPointList objectAtIndex: 0];
। । । एक्स = startPoint.x - 10; // EXC_BAD_ACCESS

संपत्ति के बाद: startPoint = [[डेटापॉइंट alloc] init]; startPoint = [[DataPointList objectAtIndex: 0] बनाए रखें];

अलविदा EXC_BAD_ACCESS


यह एक उत्कृष्ट धागा है। यहां मेरा अनुभव है: मैंने संपत्ति घोषणा पर बनाए रखने / असाइन किए गए कीवर्ड के साथ गड़बड़ कर ली है। मैंने कहा:

@property (nonatomic, assign) IBOutlet UISegmentedControl *choicesControl;
@property (nonatomic, assign) IBOutlet UISwitch *africaSwitch;
@property (nonatomic, assign) IBOutlet UISwitch *asiaSwitch;

जहां मुझे कहना चाहिए था

@property (nonatomic, retain) IBOutlet UISegmentedControl *choicesControl;
@property (nonatomic, retain) IBOutlet UISwitch *africaSwitch;
@property (nonatomic, retain) IBOutlet UISwitch *asiaSwitch;

यह जांचने के लिए कि त्रुटि क्या हो सकती है

NSZombieEnabled का प्रयोग करें।

अपने आवेदन में NSZombieEnabled सुविधा को सक्रिय करने के लिए:

निष्पादन योग्य जानकारी विंडो खोलने के लिए प्रोजेक्ट> सक्रिय निष्पादन योग्य संपादित करें चुनें। तर्क क्लिक करें। "पर्यावरण में सेट किए जाने वाले चर" खंड में जोड़ें (+) बटन पर क्लिक करें। नाम कॉलम में नाम कॉलम और YES में NSZombieEnabled दर्ज करें। सुनिश्चित करें कि NSZombieEnabled प्रविष्टि के लिए चेकमार्क चुना गया है।

मुझे यह जवाब आईफोनएसडीके पर मिला


विधि पैरामीटर को सत्यापित करने के लिए एनएसएएसएसर्ट () कॉल नीचे ट्रैकिंग और नाइटिंग से बचने के लिए बहुत आसान है।


स्ट्रिंग्स बनाते समय @ प्रतीक को न भूलें, एन C-strings रूप में C-strings इलाज EXC_BAD_ACCESS कारण बन जाएगा।

इसे इस्तेमाल करो:

@"Some String"

इसके बजाय:

"Some String"

पीएस - आमतौर पर जब कई रिकॉर्ड्स के साथ एक array की सामग्री populating।





cocoa-touch