2009-04-02 9 views
10

में डाला गया अपवाद डिबगिंग मैं लंबे समय से माइक्रोसॉफ्ट डेवलपर हूं और मैं एक्सकोड का उपयोग कर आईफोन विकास में नया हूं। इसलिए, मैं एक पुस्तक पढ़ रहा हूं और उदाहरण के माध्यम से खुद को सिखाने की कोशिश कर रहा हूं कि उद्देश्य-सी का उपयोग करके एक आईफोन एप्लिकेशन कैसे लिखना है। हालांकि, अब तक बहुत अच्छा रहा है, हालांकि, थोड़ी देर में मैं जेनेरिक 'objc_exception_throw' रनटाइम पर संदेश चलाता हूं। जब ऐसा होता है, तो इस अपवाद का स्रोत ढूंढना बहुत मुश्किल होता है। कुछ परीक्षण और त्रुटि के बाद मुझे अपना जवाब मिला। पैरामीटर में से एक गलत वर्तनी थी।उद्देश्य सी और एक्सकोड

जैसा कि आप नीचे देख सकते हैं, मैंने बटन में दूसरा 'टी' छोड़कर 'अन्य बटन टिटल्स' पैरामीटर को गलत वर्तनी दी।

UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle:@"Date and Time Selected" 
         message:message 
         delegate:nil 
         cancelButtonTitle:@"Cancel" 
         otherButonTitles:nil]; 

कारण मुझे यह जानने में समय लगता है कि कोड सफलतापूर्वक बनाया गया है। उद्देश्य-सी संकलक के लिए यह सामान्य व्यवहार है? जब मैं इस तरह की एक सामान्य वाक्यविन्यास त्रुटि करता हूं तो मैं .NET संकलक में बिल्ड विफल होने के लिए उपयोग किया जाता हूं। क्या कोई संकलक सेटिंग है जिसे मैं इन गलतियों को बनाने में निर्मित विफल बनाने के लिए बदल सकता हूं?

+1

किसी से अधिक प्रतिनिधि वाले किसी को इसे "डीबगिंग और रोकथाम 'objc_exception_throw' जैसे कुछ के शीर्षक को संपादित करना चाहिए। –

उत्तर

25

सबसे पहले, खुला ~/.gdbinit (उस फ़ाइल अपने घर निर्देशिका में .gdbinit कहा जाता है - हाँ, एक बिंदु के साथ शुरू होता है) और उस में यह डाल:

fb -[NSException raise] 
fb objc_exception_throw 
fb malloc_error_break 

कि तीन डिफ़ॉल्ट breakpoints साथ GDB को प्रारंभ करेंगे , जब वे होते हैं, तो जीडीबी आपके आवेदन को रोक देगा और आपको स्टैक ट्रेस दिखाएगा। यह एक्सकोड के साथ बहुत अच्छी तरह से एकीकृत है ताकि आप कहीं भी अपवाद या मैलोक विफल होने पर स्टैक ट्रेस तत्वों पर क्लिक करके अपने कोड के माध्यम से अच्छी तरह से चल सकें।

फिर, अपनी परियोजना पर Get Info पैनल को खोलने के (या अपनी परियोजना (Groups & Files में शीर्ष आइटम) और cmd-i मारा चुनें), Build टैब पर जाएँ और सेट अपने प्रोजेक्ट की Base SDKDevice - iPhone OS [someversion] करने के लिए। नीचे तक सभी तरह से स्क्रॉल करें और GCC 4.0 - Warnings अनुभाग खोजें। क्या आप वहां मौजूद हैं; जैसा कि आप सहज महसूस करते हैं, उतनी चेतावनियां चालू करें, लेकिन Treat Warnings as Errors चालू करें (यह GCC_TREAT_WARNINGS_AS_ERRORS के बराबर है)। व्यक्तिगत रूप से, मैं इसे इस पर सेट है:

सबसे बातों के लिए

GCC Warning Build Settings http://lhunath.lyndir.com/stuff/gcc_warnings.png

आप अब हो रही किया जाना चाहिए संकलक चेतावनी आप कोड में गलत क्या कर सकते हैं और संकलक नहीं दूँगी आप कोड को चलाने के लिए जब तक आप उन्हें ठीक। जब चीजें कंपाइलर की नाक से गुजरती हैं, तो आपको सुविधाजनक स्थान पर जीडीबी तोड़ने से आसानी से समस्या मिलनी चाहिए।

आपको NSZombie* पर भी देखना चाहिए। ये पर्यावरण चर हैं जो खराब स्मृति आवंटन या पहुंच स्थितियों पर जल्दी तोड़ने के लिए बहुत आसान हैं। उदाहरण के लिए; wih NSZombieEnabled कुछ भी वास्तव में जारी नहीं किया जाएगा; dealloc पर यह _NSZombie के साथ अधिलेखित हो जाएगा और क्या आपको इस डेलोकॉइड मेमोरी को फिर से एक्सेस करने का प्रयास करना चाहिए (एक डेलोकॉइड पॉइंटर को डिफरेंस करना) आपको सामान्य रूप से कॉल करने के बजाय जीडीबी में तोड़ने के लिए कुछ मिल जाएगा, केवल यादृच्छिक पर जारी किया जा रहा है डेटा (जो, ज़ाहिर है, वह नहीं है जो आप चाहते थे)। इस पर अधिक जानकारी के लिए, http://www.cocoadev.com/index.pl?NSZombieEnabled देखें।

+0

नोट: "जीसीसी 4.0 चेतावनी" अनुभाग आपकी सेटिंग्स में दिखाई देने के लिए (ऊपर दिखाए गए अनुसार) आपके पास बेस एसडीके और सक्रिय एसडीके डिवाइस पर सेट होना चाहिए, सिम्युलेटर नहीं। – rtemp

+0

इसके अलावा, जब आप "चेतावनियों के रूप में चेतावनियों के रूप में व्यवहार करें" सक्षम करते हैं, तो आप अभी भी चेतावनियां पहले की तरह देखेंगे लेकिन आपको 1 कुछ हद तक भ्रामक त्रुटि मिलेगी "कमांड/डेवलपर/प्लेटफ़ॉर्म/iPhoneOS.platform/Developer/usr/bin/gcc-4.0 विफल बाहर निकलें कोड 1 "। जब सभी चेतावनियां साफ़ की जाती हैं तो यह त्रुटि दूर हो जाएगी। – rtemp

8

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

TAA bt

:

इसके अलावा, जब मैं न आया हुआ अपवाद सामना करते हैं, यह कभी कभी फायदेमंद (ऊपर आना चाहिए जैसे ही आप ऐप्लिकेशन पर अमल) gdb कंसोल में छोड़ और सभी धागे के लिए बैकट्रैस पाने के लिए निम्न टाइप करने के लिए है

+0

"टाटा बीटी" "धागा सभी बैकट्रैस लागू करने" के लिए संक्षेप है और बस सभी धागे –

1

कारण यह संकलन त्रुटि नहीं है, क्योंकि यह किसी ऑब्जेक्ट को संकलित समय पर ज्ञात संदेश भेजने के लिए पूरी तरह से मान्य नहीं है (और किसी वस्तु को संदेशों को गतिशील रूप से संभालने के लिए कॉन्फ़िगर किया जा सकता है)। सभी विधि कॉल वास्तव में वस्तुओं को संदेश भेजा जा रहा है।

सामान्य रूप से, यदि आपको कोई चेतावनी दिखाई देती है तो आपको उन्हें संबोधित करना चाहिए, क्योंकि ज्यादातर मामलों में वे समस्याएं पैदा कर सकते हैं (जैसा आपने देखा)। भ्रामक पहलू यह है कि यदि आप एक बार फ़ाइल को संकलित करते हैं और इसमें केवल चेतावनियां हैं, यदि आप कक्षाओं में बदलाव किए बिना अन्य कक्षाओं को संकलित करते हैं, तो चेतावनी संकलक संदेशों में दिखाई नहीं देगी। तो हर अब और फिर आप "सभी लक्ष्यों को साफ करना" चाहते हैं और यह सुनिश्चित करने के लिए फिर से निर्माण करना चाहते हैं कि आपको कोई चेतावनी याद नहीं आती है।

2

आपने जो किया वह संकलन-समय त्रुटि नहीं है, क्योंकि उद्देश्य-सी रनटाइम रनटाइम पर जांचता है यदि कोई ऑब्जेक्ट उस संदेश को प्रतिसाद दे सकता है जिसे आप भेजते हैं।

GCC_TREAT_WARNINGS_AS_ERRORS = YES 
9

हमेशा -Werror जीसीसी सेटिंग (GCC_TREAT_WARNINGS_AS_ERRORS = YES) का उपयोग करें:

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

इसके अलावा, अगर आपको objc_exception_throw मिलता है, तो कंसोल (कमांड-शिफ्ट-आर) पर स्विच करें और पहले "कम" नंबर पते को देखें।

2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
    2528013804, 
    2478503148, 
    2528036920, 
    2528053460, 
    2358032430, 
    11076, 
    11880, 
    816174880, 
    345098340, 
    145973440, 
    816174880, 
) 

इस मामले में यह "11076" होगा। तो कंसोल में टाइप करें:

info line *11076 

यह आपको आपके कोड में लाइन बताएगा जहां अपवाद फेंक दिया गया था।

+0

के लिए बैकट्रैक प्रिंट करता है यह कुछ अच्छी सलाह है - जोड़ने के लिए एक और चीज "objc_exception_throw" पर वैश्विक ब्रेकपॉइंट सेट करना है, जो स्वचालित रूप से टूट जाएगा आपका कोड ऐसा कुछ करता है जो अपवाद फेंकता है। –

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