2009-07-07 3 views
50

मेरी अज्ञानता क्षमा करें, लेकिन आईफोन सिम्युलेटर में आईफोन अनुप्रयोगों को चलाते समय मुझे एक्सकोड डीबगर के बारे में कुछ परेशान कर रहा है।एक्सकोड/आईफोन में अनचाहे अपवाद पर स्टैक ट्रेस या अधिक जानकारी

कभी-कभी, जब मैं इंटरफ़ेस बिल्डर में कुछ गड़बड़ करता हूं, तो मुझे रनटाइम पर एक अनचाहे अपवाद मिलता है और मुझे वापस एक्सकोड में फेंक दिया जाता है। केवल एक चीज जो मैं देखता हूं वह एक पंक्ति है "बेजोड़ अपवाद" या ऐसा कुछ। जो मैं देख सकता हूं, उससे कोई अतिरिक्त जानकारी नहीं है, अकेले एक स्टैक ट्रेस या उपयोगी कुछ भी दें।

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

मुझे यकीन है कि मैं बस बहुत स्पष्ट कुछ याद कर रहा हूँ ... उम्मीद है कि हूँ ...

उत्तर

70

आप दो breakpoints जोड़ते हैं तो आपको इन अपवादों डिबग करने के लिए सक्षम होना चाहिए। ऐसा करने के लिए, रन पर जाएं दिखाएँ | ब्रेकपॉइंट्स और दो वैश्विक ब्रेकपॉइंट्स बनाएं (मैं उन्हें वैश्विक रूप से करता हूं क्योंकि वे मेरे सभी अनुप्रयोगों में बहुत उपयोगी हैं)। पहले "objc_exception_throw" नाम दिया जाना चाहिए और इसका स्थान "libobjc.A.dylib" होना चाहिए। दूसरा होना चाहिए "- [एनएसईएक्सप्शन उठाएं]" और इसका स्थान "कोरफाउंडेशन" होना चाहिए।

अब, यदि आप ब्रेकपॉइंट सक्षम के साथ अपने एप्लिकेशन को डिबग करना प्रारंभ करते हैं, तो इन अपवादों को फेंकना चाहिए। तब आपको उन घटनाओं की श्रृंखला देखने में सक्षम होना चाहिए जो डीबगर के भीतर अपवाद का कारण बनते हैं।

+1

आईफोन विकास के लिए आपको केवल पहले की आवश्यकता है। अपवाद होने के बारे में विवरण प्राप्त करने का यह सबसे अच्छा तरीका है। –

+0

हां, मुझे लगता है कि दूसरा केवल तेंदुए से पहले मैक ओएस संस्करणों पर लागू होता है। हालांकि, इसे चारों ओर रखने के लिए यह चोट नहीं पहुंचाता है। –

+1

@ केंडल हेल्मस्टेटर गेलनर @ फिलिपपे लेबेर्ट क्या यह उत्तर अभी भी xCode 4 में मान्य है? मुझे libobjc.A.dylib नहीं मिल रहा है। मेरा मतलब है, यह भी मुझे स्पष्ट नहीं है कि फ़ाइल में ब्रेकपॉइंट कैसे लागू करें (और कोड की रेखा नहीं?) – aneuryzm

1

आप आज़माएं/कैच में अपने UIApplicationMain लपेट कर सकते हैं:

int main(int argc, char *argv[]) { 
    int retVal; 
    NSAutoreleasePool * pool; 
    @try 
    { 
    pool = [[NSAutoreleasePool alloc] init]; 
    retVal = UIApplicationMain(argc, argv, nil, nil); 
    } 
    @catch(NSException* e) 
    { 
     NSLog(@"%@", e.reason); 
    } 
    @finally 
    { 
    [pool release]; 
    } 
    return retVal; 
} 

तुम भी देखना चाहिए डिबगिंग करते समय एक दावा हैंडलर सेट करने में: NSAssertionHandler

अद्यतन: और भी बिना क्रिया का अपवाद हैंडलर: NSSetUncaughtExceptionHandler

2

हे सक्रिय - रनटाइम अपवादों के बारे में अधिक जानकारी के लिए, आपको डीबगर कंसोल खोलने और अधिक जानकारी देखने में सक्षम होना चाहिए। मुझे लगता है कि आप पहले ही ऐसा कर चुके हैं, लेकिन बस मामले में - आप मेनू से रन -> कंसोल चुनकर इसे प्राप्त कर सकते हैं। मुझे यकीन नहीं है कि यह स्वचालित रूप से क्यों नहीं आता है!

+0

ऐसा नहीं किया है, सिर के लिए धन्यवाद। मैं अभी भी एक्सकोड सीख रहा हूं (जब आप व्यावहारिक रूप से अपने जीवन के हर दिन विजुअल स्टूडियो के अंदर रह रहे हैं तो यह काफी कूद है) –

+0

हाँ - यह काफी बदलाव है। मैंने युग के लिए ग्रहण का उपयोग किया, और इंटरफ़ेस तुलना में पूरी तरह से बेकार दिखता है! केवल 5 बटन की तरह ?! हालांकि, इसमें कई छिपी हुई विशेषताएं हैं। ग्रहण अब मेरे लिए इतना बड़ा और घबराहट लगता है ... –

3

स्टैक ट्रेस की कमी आमतौर परLLDB (डीबगर) के साथ समस्या का संकेतक है। मुझे एलएलडीबी पसंद है, लेकिन जब आईओएस ऐप में मुख्य रूप से स्टैक निशान दिखाने और अपवाद पर तोड़ने की बात आती है, तो यह गधे में दर्द होता है और अब कुछ रिलीज के लिए रहा है। कोई विचार नहीं कि ऐप्पल ने अभी तक इसका समाधान क्यों नहीं किया है। इसे ठीक करने के लिए एक दो-चरणीय प्रक्रिया है:

  1. अपनी वर्तमान योजना संपादित करें और "रन" टैब के तहत एलएलडीबी से जीडीबी में डीबगर बदलें।
  2. https://developer.apple.com/bugreporter/ पर जाएं और बग की रिपोर्ट करें ताकि ऐप्पल इसे संबोधित कर सके।
संबंधित मुद्दे