2013-11-02 5 views
23

डिबग करने के लिए मैं एक त्रुटिकैसे EXC_BAD_ACCESS बग

EXC_BAD_ACCESS कोड = 2 at0xb0987654

मैं 0xb0987654 पर मूल्य प्रिंट आउट के लिए कैसे सोच रहा हूँ प्राप्त?

+0

मैं तुम्हें उस पते पर मूल्य प्रिंट आउट करना चाहते हैं नहीं है कि बहुत पता पहली जगह में आपकी समस्या है के बाद से लगता है। क्या * आपको वहाँ मिला * पूछने का सवाल है। – Jay

उत्तर

30

एक EXC_BAD_ACCESS डीबग करने के लिए, आप आम तौर पर यह पता लगा सकते हैं कि लैंडिंग पॉइंटर ज़ोंबी ऑब्जेक्ट्स को सक्षम करके कहां है।

Xcode

संपादित योजना चुनें, भागो खंड में तो निदान टैब, फिर 'ज़ोंबी वस्तुओं' विकल्प पर क्लिक करें।

AppCode

चुनें संपादित करें लक्ष्य, और निम्नलिखित वातावरण चर जोड़ें:

NSZombieEnabled=YES 

EXC_BAD_ACCESS का एक अन्य कारण अनंत प्रत्यावर्तन, कुछ लॉगिंग जोड़कर देखा जा सकता है हो सकता है। सी ++ के लिए

अद्यतन:

++ बजना संकलक के साथ झूलते सी में संकेत दिए गए डिबग करने के लिए गूगल से Address Sanitizer (ASAN) उपयोग करके देखें।

+2

मैंने कोशिश की, कोई उपयोग नहीं। चूंकि यह समस्या उत्पन्न करने वाला सी ++ कोड है। –

+0

@AdamLee इसके बारे में कैसे? http://stackoverflow.com/questions/3199067/c-catching-dangling-reference –

+0

@AdamLee, ओह, ऐसा लगता है कि मडफ्लैप केवल जीसीसी है, क्लैंग/llvm –

2

ऐसा लगता है कि आप एक कोड पेज या कुछ लिखने की कोशिश कर रहे हैं? EXC_BAD_ACCESS /usr/include/mach/exception_types.h में वर्णित है:

#define EXC_BAD_ACCESS   1  /* Could not access memory */ 
      /* Code contains kern_return_t describing error. */ 
      /* Subcode contains bad memory address. */ 

और kern_return.h से:

#define KERN_PROTECTION_FAILURE   2 
      /* Specified memory is valid, but does not permit the 
      * required forms of access. 
      */ 

जहां आप देख सकते है कि पता अपनी बाइनरी में है ऐसा करके:

(lldb) image lookup -va 0xb0987654 

लेकिन आपको वास्तव में यह जानने की आवश्यकता है कि वहां कौन लिखने की कोशिश कर रहा है। यदि समस्या सरल है तो यह आपको बता सकता है कि क्या गलत है, लेकिन जैसा कि जैस्पर सुझाव देता है, शायद यह कुछ उपयोग-मुक्त या अन्य ऐसी समस्या है, और खराब अभिनेता लंबे समय तक दुर्घटनाग्रस्त हो गया है। गार्डमॉलोक कभी-कभी इस तरह की त्रुटि को पकड़ सकता है (आप इसे रन योजना में एक्सकोड में सक्षम कर सकते हैं।)

+7

' एलएलडीबी में छवि लुकअप -वा 0x1586470c4' मुझे कोई आउटपुट नहीं देता है, यहां तक ​​कि एक त्रुटि संदेश भी नहीं। –

+0

वर्तमान में "छवि लुकअप-ए" सिर्फ किसी दिए गए पते पर यह पता लगा सकता है कि "किसी भी पते पर कोई प्रतीक नहीं" के मामले में, जब भी कुछ भी नहीं है ... एलएलडीबी को वास्तव में कुछ त्रुटि प्रिंट करनी चाहिए जब यह नहीं हो सकती किसी दिए गए पते से जुड़े किसी भी प्रतीक को ढूंढें। कृपया इसके बारे में ऐप्पल के बग रिपोर्टर या lldb.llvm.org बगजिला के साथ एक बग दर्ज करें। धन्यवाद। –

0

पहचानें कि आपने क्रैश के कारण क्या किया है। किसी विशेष व्यू कंट्रोलर को लोड या किसी प्रतिनिधि विधि में या किसी विशेष कार्रवाई पर देखते हुए यह क्रैश हो गया था। यह अक्सर उस ऑब्जेक्ट को खोजने में मदद करेगा जो त्रुटि का सामना कर रहा है।

  • अधिकांश समय "NSZombies" मृत वस्तु की पहचान करने में मदद कर सकता है। आप अपनी योजना को संपादित करके NSZombies को सक्षम कर सकते हैं उत्पाद -> योजना संपादित करें -> डायग्नोस्टिक्स।
  • यदि आपको अभी भी मूल कारण नहीं मिलता है तो हमेशा देखने के लिए किस वस्तु को बनाए रखने की आवश्यकता है या किस संदेश को सही तरीके से पारित करने की आवश्यकता है, यह देखने के लिए हमेशा बाल दृश्य नियंत्रक से मूल दृश्य नियंत्रक से पीछे जाएं।
  • उन्नत डिबगिंग के लिए स्टेटिक विश्लेषक और इंस्ट्रूमेंट्स में देखें।

मुझे आशा है कि यह आपकी मदद करेगा।

सादर, GISON