2012-05-08 8 views
22

क्या डीबगर से स्रोत कोड (या कुछ भी समस्या है जहां डीबग करने में मदद करता है) के लिए एक लाइन नंबर प्राप्त करना संभव है, जो दिखाता है कि समस्या कहां उत्पन्न हो रही है?उद्देश्य सी - डीबगर त्रुटि से लाइन नंबर या पूर्ण स्टैक ट्रेस प्राप्त करना?

मैं एक त्रुटि हो रही है:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9) 

जो स्पष्ट रूप से इसका मतलब है कि मैं कुछ बिंदु पर सीमा से बाहर जा रहा हूँ, लेकिन अगर यह संभव मैं मुझे समस्या को हल करने में मदद करने के लिए कुछ और अधिक जानकारी प्राप्त करना चाहते हैं।

मैं ब्रेकपॉइंट रख रहा हूं और लाइन लाइन से प्रोग्राम लाइन के माध्यम से जाने की कोशिश कर रहा हूं लेकिन यह एक कठिन प्रक्रिया है। धन्यवाद!

उत्तर

81

जब डीबगर बंद हो जाता है, तो "डीबग नेविगेटर" पर जाएं और सुनिश्चित करें कि नीचे स्लाइडर दाईं ओर सभी तरह से है।

उस बिंदु से अपनी आंख को नीचे स्कैन करें जिस पर अपवाद फेंक दिया गया है और आपको अंततः अपने कोड पर आना चाहिए। उचित विधि/फ़ंक्शन नाम पर क्लिक करें और संपादक में कोड खोला जाएगा।

enter image description here

enter image description here

आप स्टैक ट्रेस में अपने स्वयं के तरीकों में से किसी भी दिखाई नहीं देता है, अपवाद एक performSelector शैली कॉल के माध्यम से पारित कर दिया गया हो सकता है जो मामले में स्टैक ट्रेस चला गया है । यदि ऐसा है, तो आपको "थ्रो" अपवाद ब्रेक पॉइंट जोड़कर बेहतर जानकारी मिल सकती है। "ब्रेकप्वाइंट नाविक" पर स्विच:

enter image description here

फिर प्लस पर क्लिक करें और चुनें "अपवाद ब्रेकप्वाइंट जोड़ें ..."

enter image description here

एक "फेंक पर" तोड़ बिंदु बनाएँ :

enter image description here

यह सटीक बिंदु पर डिबगर बंद हो जाएगा अपवाद फेंक दिया जाता है, और आपको एक बेहतर स्टैक ट्रेस मिलता है। यह एक अच्छा विचार है कि इस तरह एक अपवाद ब्रेक पॉइंट हमेशा सक्षम हो, हालांकि आपको कभी-कभी ऐप्पल कोड से आंतरिक अपवाद मिलेंगे (उदाहरण के लिए QLPreviewController, MPMoviePlayerController का उपयोग करते समय)।

+0

मीठे! बहुत बहुत धन्यवाद माइक! क्या एक्सकोड 3.x में कुछ समान है? मैं घर पर एक्सकोड 4.3 का उपयोग करता हूं लेकिन काम पर यह अभी भी एक्सकोड 3 है। एक बार फिर धन्यवाद। – Kevin

+2

आप अभी भी एक्सकोड 3 का उपयोग क्यों कर रहे हैं? यह एक बहुत बुरा विचार है। –

+0

मेरे मालिक को बताओ कि! आपकी मदद माइक के लिए धन्यवाद। – Kevin

7

आपको NSSetUncaughtExceptionHandler का उपयोग करने पर भी विचार करना चाहिए। अपने didFinishLaunchingWithOptions विधि में (आप आदि डिस्क पर क्रैश लॉग को बचा सकता है, अगर एक नया क्रैश लॉग बचा लिया गया था अगले स्टार्टअप जाँच, एक ईमेल में अटैच कर,)

इस पुट:

NSSetUncaughtExceptionHandler(&exceptionHandler); 

और अपने अपवाद हैंडलर को लागू करें:

void exceptionHandler(NSException *exception) 
{   
    NSLog(@"%@",[exception name]); 
    NSLog(@"%@",[exception reason]); 
    NSLog(@"%@",[exception userInfo]); 
    NSLog(@"%@",[exception callStackSymbols]); 
    NSLog(@"%@",[exception callStackReturnAddresses]); 
} 
संबंधित मुद्दे