2011-10-09 8 views
109

हर बार मेरे ऐप Xcode पर प्रकाश डाला गया main() लाइन है कि दुर्घटना का कारण बना के रूप में समारोह में UIApicationMain() कॉल दुर्घटनाओं का कारण बनता है नहीं दिखाती है।Xcode लाइन है कि एक दुर्घटना

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)' 

Xcode लाइन दिखाने के लिए इस्तेमाल सिर्फ सही: कुछ मामलों कि सामान्य होने के लिए (उदाहरण के लिए विभाजन गलती), लेकिन दुर्घटना मैं से निपटने के लिए कोशिश कर रहा हूँ इस्तेमाल किया कंसोल में लॉग इन विस्तृत जानकारी के साथ एक सरल SIGABRT है पुराने एसडीके के साथ, लेकिन जब से मैंने Xocde 4.2 में अपग्रेड किया जो बदल गया। यह बहुत स्पष्ट है कि एक्सकोड जानता है कि क्रैश (या पता कैसे) का कारण बन गया था, लेकिन यह अभी भी वास्तविक रेखा नहीं दिखा रहा है। क्या इसके लिए कोई फिक्स या वर्कअराउंड है?

+2

क्या आप रिलीज के लिए संकलित हैं? यदि ऐसा है तो योजना को डीबग में सेट करने का प्रयास करें। – epatel

+0

डीबग करने के लिए सेट। – JonasG

+0

यह भी हो सकता है कि कुछ xib खराब है क्योंकि प्रोग्राम आपके स्वयं के स्रोत कोड से किसी स्थान पर क्रैश हो रहा है, इस प्रकार, कोई फ़ाइल नहीं दिखा रहा है। त्रुटि "दिनांक" – epatel

उत्तर

275

आपको यह भी सुनिश्चित करना चाहिए कि आपके पास सभी अपवादों के लिए ब्रेकपॉइंट सेट हैं। यह एक्सकोड को लाइन पर रुकने का कारण बन जाएगा जहां अपवाद हो रहा है। ।

  1. Xcode के बाईं ओर स्थित परियोजना नेविगेटर में, ब्रेकपाइंट नाविक (लगभग सभी शीर्ष बटन पट्टी के दाहिने हाथ की ओर के रास्ते पर क्लिक करें आइकन: निम्नलिखित [Xcode 4 में] है एक वसा दायां तीर की तरह दिखता है)।

  2. नाविक के नीचे, "+" बटन पर क्लिक करें।

  3. "अपवाद ब्रेकपॉइंट जोड़ें" पर क्लिक करें।

  4. एक नया ब्रेकपॉइंट बनाया जाएगा। इसे आवश्यकतानुसार कॉन्फ़िगर किया जाना चाहिए लेकिन आप इसके व्यवहार को बदल सकते हैं।

  5. अपनी परियोजना चलाने के लिए और अपवाद प्रजनन करते हैं।

यह भी बताया गया है कि आपने कुछ तृतीय पक्ष पुस्तकालयों/ढांचे से जुड़ा हुआ है। यदि उन ढांचे के भीतर अपवाद हो रहा है तो कोड को संकलित करने के बाद आपको कठिन समय होगा और एक्सकोड वास्तव में आपको उस रेखा को नहीं दिखा सकता है जो अपवाद का कारण बनता है। यदि यह मामला है और आप निश्चित हैं कि आप पुस्तकालयों का सही ढंग से उपयोग कर रहे हैं, तो आपको उन पुस्तकालयों के रखरखावकर्ताओं को एक बग रिपोर्ट दर्ज करनी चाहिए।

+6

नमस्ते, मैंने आपके समाधान की कोशिश की, लेकिन यह इसे फिर से मुख्य पर पकड़ता है .. – Dejell

+0

नहीं, "थ्रो ऑन" चुनें, अन्यथा यह होगा मुख्य पर ब्रेकपॉइंट पकड़ो। –

+5

यह उत्तर, जैसा कि लिखा गया है, एक्सकोड 5 के लिए सही है। –

2

मैंने इस व्यवहार को भारी अनुकूलित कोड में देखा है; जांच, अपने लक्ष्य के अनुकूलन स्तर को tweaking और तृतीय पक्ष libs के उन लोगों की मदद कर सकते हैं। (एलएलवीएम 3.0 अनुकूलन स्तर सेटिंग)

क्या आप डीबग प्रतीकों का उत्पादन कर रहे हैं?

+0

सहमत। यदि आप डीबग करने का प्रयास कर रहे हैं तो ऑप्टिमाइज़ेशन स्तर को अपनी बिल्ड सेटिंग्स में 0 (कोई अनुकूलन) पर सेट करने की आवश्यकता नहीं है। – Carter

7

वर्तमान योजना संपादित करें और NSZombieEnabled, MallocStackLogging, और guard malloc सक्षम करें। तब, जब आपका ऐप्स क्रैश, gdb कंसोल में इस टाइप करें:

(gdb) info malloc-history 0x543216 

उद्देश्य यह है कि NSInvalidArgumentException वजह से के पते के साथ 0x543216 बदलें और यह आप एक अधिक उपयोगी स्टैक ट्रेस देना चाहिए, की तर्ज दिखा अपने कोड जो दुर्घटना का कारण बन रहा है।

+0

मैंने कोशिश की, और त्रुटि फेंक दी गई: 'जानकारी' वैध आदेश नहीं है। कोई सलाह? – achi

+0

@EliGregory सुनिश्चित करें कि आपका डीबगर जीडीबी पर सेट है और डिफ़ॉल्ट एलएलडीबी नहीं है। आप इसे रन सेक्शन के तहत संपादित करें स्कीम मेनू में बदल सकते हैं। – chown

14

बस इस StackOverflow जवाब पर दिए गए निर्देशों का पालन करें:

Enable Zombies

मूल रूप से, आप बस "Zombies सक्षम करें" की जरूरत है। फिर एक्सकोड को जो भी लाइन समस्या का कारण बनती है उसे तोड़ना चाहिए।

enter image description here

(यह पूरी तरह चौंकाने वाला है कि, 2017 में भी, Xcode अभी भी इस बंद डिफ़ॉल्ट रूप से बदल गया है है। तुम क्यों नहीं लाइन है कि समस्या का कारण देखना चाहते हैं? और "सक्षम ज़ोंबी ऑब्जेक्ट्स "? वास्तव में?! क्या एक्सकोड लेखकों का मानना ​​है कि यह एक उपयोगी नाम है, जो नए डेवलपर्स को किसी तरह का एहसास देगा? यह निराशाजनक है कि ऐप स्टोर में साल के बाद एक्सकोड की रेटिंग कितनी खराब है। कोई भी नहीं सुन रहा है ...)

+0

तो सच ... बहुत सारे तरीकों से विजुअल स्टूडियो के पीछे। – Brduca

+2

एक महान बिंदु, माइकग्लिडहिल। – Fattie

0

मैंने बाध्य से सूचकांक का दुर्घटना उत्पन्न करने के लिए कोड लिखा था। निम्नलिखित अपवाद फेंक दिया गया है।

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010e85cd4b __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x000000010e2be21e objc_exception_throw + 48 
    2 CoreFoundation      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 
    3 testABC        0x000000010dce962d -[ViewController ComplexFunction] + 61 
    4 testABC        0x000000010dce95db -[ViewController thirdFunction] + 43 
    5 testABC        0x000000010dce959b -[ViewController secondFunction] + 43 
    6 testABC        0x000000010dce955b -[ViewController firstFinction] + 43 
    7 testABC        0x000000010dce96c2 -[ViewController viewDidAppear:] + 50 
    8 UIKit        0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 
    9 UIKit        0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42 
    10 UIKit        0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86 
    11 UIKit        0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653 
    12 UIKit        0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566 
    13 UIKit        0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194 
    14 CoreFoundation      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 
    15 CoreFoundation      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356 
    16 CoreFoundation      0x000000010e7e5e65 __CFRunLoopRun + 901 
    17 CoreFoundation      0x000000010e7e5884 CFRunLoopRunSpecific + 420 
    18 GraphicsServices     0x00000001126d9a6f GSEventRunModal + 161 
    19 UIKit        0x000000010ec80c68 UIApplicationMain + 159 
    20 testABC        0x000000010dce99df main + 111 
    21 libdyld.dylib      0x000000011174968d start + 1 
    22 ???         0x0000000000000001 0x0 + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

आप ध्यान से पढ़ें First Throw call stack

0 CoreFoundation    0x000000010e85cd4b __exceptionPreprocess + 171 
1 libobjc.A.dylib    0x000000010e2be21e objc_exception_throw + 48 

0 and 1 दुर्घटना के बाद सिस्टम प्रक्रियाओं कर रहे हैं।

2 CoreFoundation    0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 

2 वह रेखा है जो अपवाद का कारण बनती है।

3 testABC      0x000000010dce962d -[ViewController ComplexFunction] + 61 

3 आपको लगता है कि कक्षा नाम (ViewController) और समारोह naem (ComplexFunction) जिसमें अपवाद उत्पन्न हुआ था बताता है।

+1

एरर, ठीक है। तुम बिल्कुल सही हो, लेकिन क्या यह दोस्ताना है? किसी भी आधुनिक (1 99 0 के बाद) विकास पर्यावरण, जब एक अपवाद होता है, तो आपको उस रेखा पर ले जाया जाता है जिससे समस्या उत्पन्न होती है। जबकि एक्सकोड ... अच्छा ... आपको इस तरह का एक स्टैक ट्रेस देता है। यहां तक ​​कि टर्बो पास्कल भी पुराना नहीं था !!! –

+0

यह हास्यास्पद है कि कंपनी जिसे "सर्वश्रेष्ठ उपयोगकर्ता अनुभव" के लिए जाना जाता है, यह महसूस नहीं करता है कि पिछले 20 वर्षों के लिए सभी डेवलपर्स लाइन नंबर को देखने के आदी हैं जहां अपवाद फेंक दिया गया है और एस्सेबलर में नहीं है। क्या मैं पागल हो रहा हूँ? मैंने अपनी पूरी जिंदगी के साथ कभी भी काम की हर भाषा लाइन संख्या दी है। यहां तक ​​कि सी या सी ++। – mylovemhz

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