2011-11-23 21 views
9

नहीं दिखा रहा बाउंड त्रुटि से बाहर निम्नलिखित सूचकांक हो रही है:NSRangeException: ढेर कॉल पंक्ति संख्या

*** Terminating app due to uncaught exception 'NSRangeException', reason: 
'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 
*** First throw call stack: 
(0x2263052 0x24c7d0a 0x224fdb8 0x2f4a7 0x2264ec9 0x81e299 0x81e306 0x75aa30 
0x75ac56 0x741384 0x734aa9 0x39a9fa9 0x22371c5 0x219c022 0x219a90a 0x2199db4 
0x2199ccb 0x39a8879 0x39a893e 0x732a9b 0x1e5b 0x1dc5 0x1) 

मैं बिल्कुल पता है कि त्रुटि का अर्थ है, लेकिन मैं किसी कारण से, क्योंकि ठीक करने के लिए इन त्रुटियों को बहुत मुश्किल लगता है कॉल स्टैक मुझे कोड की रेखा नहीं बता रहा है जहां सरणी को बुलाया जा रहा था।

#0 0x9706d9c6 in __pthread_kill() 
#1 0x93e2cf78 in pthread_kill() 
#2 0x93e1dbdd in abort() 
#3 0x02859e78 in dyld_stub__Unwind_DeleteException() 
#4 0x0285789e in default_terminate()() 
#5 0x024c7f4b in _objc_terminate() 
#6 0x028578de in safe_handler_caller(void (*)())() 
#7 0x02857946 in __cxa_bad_typeid() 
#8 0x02858b3e in __cxa_current_exception_type() 
#9 0x024c7e49 in objc_exception_rethrow() 
#10 0x02199e10 in CFRunLoopRunSpecific() 
#11 0x02199ccb in CFRunLoopRunInMode() 
#12 0x039a8879 in GSEventRunModal() 
#13 0x039a893e in GSEventRun() 
#14 0x00732a9b in UIApplicationMain() 
#15 0x00001e5b in main 

आप देख सकते हैं इस कॉल स्टैक बहुत उपयोगी है क्योंकि यह मेरे कोड से किसी भी तरीकों प्रदर्शित नहीं करता है नहीं है: यहाँ धागा 1 से कॉल स्टैक है। इसके अलावा, कॉल त्रुटि में दिखाया गया है, जबकि ढेर धागा 1 से ढेर केवल 15 है, और पतों पर सब से मेल नहीं खाते, 22 स्मृति पते हैं। किसी अन्य धागे में कोई उपयोगी जानकारी नहीं है।

कैसे यह त्रुटि (22 पते के साथ एक) से "सबसे पहले फेंक कॉल स्टैक" का धागा को देखने के लिए, तो मैं लाइन जिसके कारण त्रुटि पा सकते हैं हो सकता है? शायद मेरे पास बिल्ड बिल्ड सेटिंग्स में कुछ गलत तरीके से सेट है जो प्रासंगिक स्टैक को पुनर्प्राप्त करने योग्य नहीं है?

कोई इस पर सही दिशा में मुझे बिंदु सकता है मैं बहुत आभारी होंगे। अपमानजनक रेखा को मैन्युअल रूप से ढूंढने का प्रयास करना काफी कठिन है।

धन्यवाद!

उत्तर

17

डीबगर चालू करें और जब भी कोई अपवाद फेंक दिया जाए तो ब्रेकपॉइंट सेट करें, इस तरह आप वास्तव में जानते हैं कि कोड की कौन सी रेखा झटका है।

objc_exception_throw

वैकल्पिक रूप से, [NSException उठाना]; Add breakpoint to objc-exception-throw

+9

धन्यवाद Antwan, यह पूरी तरह से काम करता है! एक्सकोड 4 में ऐसा करने की कोशिश करने वाले किसी भी व्यक्ति के लिए, यहां दिए गए चरणों का उपयोग किया गया है: 1. ब्रेकपॉइंट्स नेविगेटर (दाईं ओर से दूसरा टैब) के निचले बाएं कोने में जोड़ें ("+") बटन क्लिक करें। 2. चुनें अपवाद ब्रेकप्वाइंट जोड़ें। 3।"अपवाद" के लिए "सी ++" चुनें 4. "नामित" प्रकार "objc_exception_rethrow" के आगे 5. संपन्न क्लिक करें। – llama591

2

आप अपने प्रोजेक्ट में वैश्विक breakpoints सक्षम किया था:

निम्नलिखित प्रश्न पर एक नज़र है? अगर परियोजना नाविक में breakpoints अनुभाग के लिए objc_exception_throw नहीं जोड़ तो ऐप्लिकेशन को फिर से चलाने के लिए, आप ढेर मिलना चाहिए। एडिशन में, जब आप खुशियों को दुर्घटनाग्रस्त करते हैं, तो उनके ढेर को देखने के लिए किसी भी अतिरिक्त धागे को देखते और विस्तृत करते हैं। यह मेरे लिए कई बार हुआ है कि ढेर मैं खोज रहा था, हालांकि दुर्घटना मुख्य थ्रेड द्वारा रिपोर्ट किया जा रहा था एक पृष्ठभूमि धागा में था। HTH।

0

यह मानते हुए कि एक्सकोड डीबगर में यह हुआ, आप ट्रेसबैक पते में संदर्भित कोड की रेखा निर्धारित कर सकते हैं।

उदाहरण के लिए, अपने पहले प्रवेश के लिए, आप निम्न में प्रवेश करेंगे ट्रैस बैक से

सूची * पता: डिबग विंडो में, निम्न दर्ज सूची * 0x2263052

प्रत्येक पते के लिए यह करें । उनमें से एक को आपके प्रोग्राम कोड पर इंगित करना चाहिए और विफल लाइन के ऊपर और नीचे असफल लाइन नंबर और कोड सूचीबद्ध करना चाहिए।

-स्टीव