Xcode दुर्घटना का कारण बनने वाली रेखा नहीं दिखाता है


126

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

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

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


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

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

1
Apple को अधिक परीक्षक नियुक्त करना चाहिए;)
अमृत ​​लॉट

जवाबों:


301

आपको यह भी सुनिश्चित करना चाहिए कि आपके पास सभी अपवादों के लिए विराम बिंदु निर्धारित हैं। इससे Xcode उस रेखा पर रुक जाएगा जहां अपवाद हो रहा है। निम्नलिखित करें [Xcode 4 में]:

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

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

  3. "एक्सेप्शन ब्रेकप्वाइंट जोड़ें" पर क्लिक करें।

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

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

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


4
मैं एक नोब हूं और इसके बिना लगभग एक महीने विकसित हुआ ... इससे मेरा जीवन बदल जाता है।
जॉनी बर्गर

4
मेरे दोस्त ने इस पोस्ट को अपडाउन करने के लिए एक SO अकाउंट के लिए रजिस्टर किया।
एलेक्स स्पेंसर

1
इसे मेरी पुस्तक में सेब के हिस्से का आधा
गधा

1
यह किया है, लेकिन अभी भी नहीं मिल सकता है जहां यह एक अशक्त पर लंबाई कहा जाता है :(
शेरिफ Marzouk

1
यह काम करता है, लेकिन नकारात्मक पक्ष यह नहीं है कि डिबग कंसोल में अपवाद का विवरण आउटपुट करता है। इसलिए मैं इस ब्रेकपॉइंट को बंद कर सकता हूं, और अपवादों का विवरण और ट्रेस देख सकता हूं, लेकिन ऐसा नहीं हुआ है, या इसे चालू करने के लिए यह देखने के लिए कि यह कहां हुआ है, लेकिन क्यों नहीं। किसी को पता है कि दोनों कैसे है?
गैब्रियल जेन्सेन

27

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

लाश सक्षम करें

असल में, आपको बस "लाश सक्षम करें" की आवश्यकता है। फिर Xcode को जो भी समस्या हो लाइन में ब्रेक करना चाहिए।

यहाँ छवि विवरण दर्ज करें

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


6
Xcode सबसे खराब प्रोग्रामिंग वातावरण है जिसका मैंने अब तक उपयोग किया है।
छात्र

मुझे क्या दिलचस्प लगता है (एक विजुअल स्टूडियो डेवलपर के रूप में) मैं कितने एक्सकोड डेवलपर्स से मिला हूं, जो इस बात पर जोर देते हैं कि एक्सकोड सबसे अच्छा वातावरण है जो उन्होंने कभी इस्तेमाल किया है। तार्किक, मिलनसार और सहायक .. लेकिन कुछ विचित्रताओं के साथ। अब भी, नवंबर 2019 में, Xcode की ऐप स्टोर रेटिंग 3.1 है, जिसमें अधिकांश लोग इसे 5-स्टार या 1-स्टार देते हैं। कोई नहीं सुन रहा है ....
माइक गिल्डहिल

10

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

(gdb) info malloc-history 0x543216

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


1
मैंने यह कोशिश की, और त्रुटि को फेंक दिया गया: 'जानकारी' एक मान्य कमांड नहीं है। कोई सलाह?
अचाई

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

2

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

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


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

1

इंडेक्स ऑफ बाउंड को क्रैश करने के लिए मैंने कोड लिखा था। निम्नलिखित अपवाद फेंका गया है।

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) और फ़ंक्शन नाम ( ) ComplexFunctionजिसमें अपवाद फेंका गया था।


4
इर्रर, ठीक है। आप बिल्कुल सही हैं, लेकिन क्या यह अनुकूल है? किसी भी आधुनिक (1990 के दशक के बाद) विकास के माहौल में, जब कोई अपवाद होता है, तो आपको उस लाइन पर ले जाया जाता है, जो समस्या का कारण बनी। जबकि Xcode ... अच्छी तरह से ... आपको इस तरह से एक स्टैक ट्रेस देता है। यहां तक ​​कि टर्बो पास्कल यह पुराना नहीं था !!!
माइक गल्डहिल

4
यह हास्यास्पद है कि कंपनी जिसे "सर्वश्रेष्ठ उपयोगकर्ता अनुभव" के लिए जाना जाता है, यह महसूस नहीं करता है कि पिछले 20 वर्षों के लिए सभी डेवलपर्स लाइन नंबर को देखने के आदी हैं जहां एक अपवाद फेंक दिया गया है और ASSEMBLER में नहीं है। क्या मैं पागल हो रहा हूँ? मैंने अपने पूरे जीवन के साथ कभी भी काम किया हर भाषा लाइन नंबर देती है। यहां तक ​​कि सी या सी ++।
mylovemhz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.