2010-11-25 7 views
6
डिबग करते

निम्नलिखित का प्रयास करें:कैसे आप Android inEclipse

  1. एक HelloWorld आवेदन बनाएँ।

 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Log.d("HelloWorldActivity.onCreate()", "setContentView() completed"); 
    } 
  1. प्लेस लॉग विवरण पर एक ब्रेकपाइंट:

  2. एक लॉग बयान onCreate के अंत में जोड़ें।

  3. एमुलेटर में ऐप चलाएं और ध्यान दें कि यह कार्य करता है और ग्रहण की लॉगकैट विंडो में लॉग इन प्रविष्टि देखने के लिए कदम उठाता है।

  4. गतिविधि के बजाए ListActivity से विस्तार करने के लिए HelloWorldActivity बदलें।

     
    public class HelloWorldActivity extends ListActivity { 
    
  5. एमुलेटर में ऐप को दोबारा चलाएं और ध्यान दें कि यह लॉग स्टेटमेंट तक पहुंचने में विफल रहता है।

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

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

तो, सीधे शब्दों में:

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

एकाधिक सुझाव और चर्चा का स्वागत है। :)

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

धन्यवाद।

इनवेसिव तकनीक: 1. एक टोस्ट कोड स्थानों में जहां आप आपने देखना चाहते हैं

========

सारांश तकनीक सूची अब तक इस प्रकार है मार डाला। 2. प्लेस के चारों ओर प्रयास करें/पकड़ें जहां आपको लगता है कि एक अपवाद को फेंकने की संभावना है। 3. कोड को टिप्पणी करें और पुनः संकलित करें और पुनः प्रयास करें।

गैर-आक्रामक तकनीकें: 1. डीबगर का उपयोग करें। ब्रेकपॉइंट्स, वेरिएबल निरीक्षण ... 2. बंदर तनाव परीक्षक। 3. एंड्रॉइड स्रोत लाइब्रेरी डाउनलोड करें। 4. यह देखने के लिए लॉगकैट फ़िल्टर का उपयोग करें कि "कारण द्वारा" सूचीबद्ध है या नहीं।

उपलब्ध होने पर अस्पष्ट: 1. एंड्रॉइड लाइब्रेरी का डीबग संस्करण जिसमें अतिरिक्त लॉगिंग, दावे या अन्य अतिरिक्त सहायता है। 2. डीबग फलक या अन्य तकनीकों के माध्यम से ग्रहण में अपवाद का निरीक्षण करने की क्षमता। 3. अधिक वैश्विक प्रयास/पकड़ अपवाद हैंडलर को परिभाषित करने का एक तरीका। 4. एंड्रॉइड लाइब्रेरी स्रोत कोड के माध्यम से डीबग करने की क्षमता।

उपलब्ध नहीं है: 1. अपवाद की सामग्री को देखने के लिए एक गैर-आक्रामक तरीका या जहां अपवाद हुआ।

+0

अपवाद विवरण निरीक्षण के लिए मैं अक्सर जाँच करने के लिए डिबग मोड (विंडो> दिखाएं देखें> भाव) में भाव विंडो का उपयोग मान। अपवाद के रूप में अपवाद की जांच करते समय यह आसान है .getMesage() हमेशा एक संदेश (यानी शून्य) वापस नहीं करता है, जबकि ब्रेक पॉइंट में डीबग मोड में दाएं बिंदु पर राइट क्लिक करें और "घड़ी" चुनें। इसे देखने के लिए आपको अपवाद पर कदम उठाना होगा। – Emile

+0

ग्रहण में समस्या विंडो आपको पूर्व-संकलन समय त्रुटियों, और सख्त चेतावनियां भी दिखाएगी। (विंडो> दृश्य दिखाएं> अन्य ... समस्याएं) – Emile

+0

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

उत्तर

2

हे, प्रश्न पूछना। खैर, पहली युक्ति, आप फ़िल्टर कर सकते हैं कि कौन सी logcat आपको बताता है। उदाहरण के लिए, आप इसे लाल (ई) में क्लिक करके केवल त्रुटियों को दिखाते हैं। यह आपको यह भी बताता है कि त्रुटि तब हुई जब आप डीबग मोड में अपना ऐप चलाते हैं। यह या तो आपको सीधे आपके कोड या एंड्रॉइड एसडीके पर इंगित कर सकता है। यह जानकर कि एंड्रॉइड पैकेज ने त्रुटि का कारण बनने में बड़ी मदद की है।

ये दोनों मेरे दिमाग में बस आते हैं। आशा करता हूँ की ये काम करेगा!

+0

हां, लाल (ई) फ़िल्टर करना प्रतीत होता है, इसलिए यह एक बड़ी मदद है। क्या आपको पता है कि अपवादों को एक (ई) रोटर, चेतावनी, जानकारी लॉग करना है या नहीं? चूंकि मुझे कोई नहीं दिखाई देता है, मुझे यकीन नहीं है कि यह कैसा दिखना चाहिए। यदि यह एक (ई) रैर है, तो आपका सुझाव महत्वपूर्ण रूप से संदेशों की संख्या में कटौती करेगा। – user405821

+0

इसके अलावा, "डीबग मोड" के संबंध में। क्या यह वही है जहां आप बस चलने की बजाय बग आइकन पर क्लिक करते हैं या क्या कुछ डीबग लाइब्रेरी है जिसे मुझे लोड करना चाहिए। मैं एक विंडोज प्रोग्रामर से अधिक हूं और जब मैं एमएफसी के साथ काम करता हूं, तो उनके पास लाइब्रेरी का डिबग संस्करण है ताकि आप वास्तव में उस स्रोत कोड का पता लगा सकें। क्या एंड्रॉइड/एक्लिप्स के साथ ऐसा कुछ है? – user405821

+0

उत्कृष्ट सुझाव। साझा करने के लिए धन्यवाद। :) – user405821

0

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

public void onCreate(Bundle savedInstanceState) { 
    try{ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    }catch(Exception exception) 
    { 
     // put break point on line below so you can evaluate exception in debug mode. 
     Log.e(TAG, "Set content exception "+ exception.getMessage()); 
     // note some exceptions return null on getMessage(); 
    } 
    Log.d("HelloWorldActivity.onCreate()", "setContentView() completed"); 
} 

तो यदि आपका स्टैक ट्रेस विशाल है तो इससे मदद मिलेगी। अन्य डेवलपर्स ने यह भी पाया है कि एसडीके के लिए स्रोत कोड प्राप्त करने का अर्थ है कि आप मुख्य एसडीके कोड में त्रुटि कहां फेंक सकते हैं। मैंने हालांकि यह नहीं किया है।

+0

स्रोत कोड होने से सहायक होगा। बहुत उपयोगी! मुझे पता था कि यह उपलब्ध था, लेकिन मुझे यकीन नहीं था कि आप इसके माध्यम से पता लगाने के लिए डीबगर का उपयोग कर सकते हैं। यह बेहद सहायक होगा। क्या कोई विवरण है कि कैसे इसे अपने डीबगिंग सत्र में एकीकृत करें? – user405821

+0

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

+0

यदि परीक्षण कोड कर रहे हैं, तो इसे सभी को एक ही प्रयास में रखें, फिर उन विशिष्ट मामलों के लिए और जोड़ें जो आप चाहते हैं nage। कम से कम इस तरह से आप समय बचा सकते हैं जब एक अपवाद फेंक दिया जाता है, और यह अधिक प्रयास नहीं करता है। – Emile

0

प्रयास/पकड़ के साथ पकड़े गए अपवाद त्रुटियां हैं और कार्यक्रम के सामान्य प्रवाह को तोड़ते हैं।

डीबग मोड में चल रहा है बस बग बटन में क्लिक कर रहा है। मुझे नहीं पता कि कोई "विशेष" डीबग पुस्तकालय हैं या नहीं। लेकिन एंड्रॉइड के साथ काम करते समय, सभी "पुस्तकालय" खुले स्रोत हैं ताकि आप कुछ भी देख सकें।

डीबग मोड के बारे में अच्छी बात यह है कि जब कोई त्रुटि होती है, तो त्रुटि होने पर आपका ऐप लिंबो में जमे हुए है। आप सेट ब्रेकपॉइंट्स सेट कर सकते हैं, अपने प्रोग्राम को चलाते समय फ्लाई पर अपना कोड बदल सकते हैं, जो बढ़िया है (ठीक है, आप एक विधि नाम बदलने जैसे कठोर परिवर्तन नहीं कर सकते हैं)।

एंड्रॉइड में बग और त्रुटियों का इलाज करने का तरीका, हालांकि, .NET से थोड़ा अलग हो सकता है, क्योंकि प्रत्येक में मॉडल अलग है।

विंडोज़ में प्रोग्रामिंग करते समय, ऐप्स छोटे द्वीपों की तरह काम करते हैं। आपके पास कोड प्रवाह पर बहुत अधिक प्रत्यक्ष नियंत्रण होता है (यानी: जब आप कुछ डेटा इनपुट करते हैं तो आप कोडफ्लो को फ्रीज करने के लिए एक मॉडल संवाद को कॉल कर सकते हैं) और आप केवल एक थ्रेड का उपयोग करके एक पूरी तरह कार्यात्मक प्रोग्राम बना सकते हैं। एंड्रॉइड में लगभग सब कुछ अपने सिंक में चलता है। और निष्पादन के बीच में एक फोन कॉल प्राप्त करने जैसी चीजों को संभालने के लिए आपका ऐप तैयार होना चाहिए। इसलिए, आप इस मॉडल को डिबगिंग पर भी लागू कर सकते हैं: Errors (that happen due to unforsen circumstances) tend to propagate much more than in other development ambient। जिस तरह से त्रुटियों को संभाला जाता है वह भी अलग होता है: यह तब स्पष्ट होता है जब आप महसूस करते हैं कि आपका ऐप अभी भी अपवाद फेंकने के बाद भी चलता है।

कुछ और उपयोगी टिप्स: आप बंदर कहा जाता है एक बहुत शक्तिशाली उपकरण है, एक तनाव उपकरण है जो "उत्पन्न करता है जैसे क्लिक, छूता है, या इशारों, साथ ही प्रणाली की एक संख्या के रूप में उपयोगकर्ता ईवेंट के छद्म यादृच्छिक स्ट्रीम नहीं है स्तर की घटनाओं "।

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

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

आशा है कि यह मदद करता है

+0

हाँ, मैंने एक अलग पोस्ट में "कारण से" देखा, लेकिन जब मैंने इसे अपने लॉग कैट में खोजा तो यह दिखाई नहीं दिया। क्या आपने मेरा उदाहरण आज़माया और देखा कि क्या आपको अपने लिए "कारण" है? मुझे उत्सुकता है कि मुझे कुछ ऐसा दिखना चाहिए जो मुझे याद आ रही है। – user405821

+0

ऐसा प्रतीत नहीं होता है कि जब मेरे उदाहरण में त्रुटि होती है तो मुझे अपना कोड जमे हुए मिलता है। ऐसा लगता है जैसे अपवाद फेंक दिया गया है और चूंकि मेरे पास अपवाद हैंडलर नहीं है, इसलिए मेरा कोड लॉग स्टेटमेंट से बाहर निकलता है। हो सकता है कि मैं डीबगर में कुछ सेटिंग (उदा। ब्रेक ऑन अपवाद) खो रहा हूं? – user405821

+0

लाइनों पर टिप्पणी करना एक अच्छा सुझाव है। मैं काफी कुछ कर रहा हूँ। धीमी और बोझिल की तरह, लेकिन निश्चित रूप से प्रभावी। एक बार जब मैं इस पोस्ट के लिए सभी सुझाव प्राप्त करता हूं, तो मैं उन्हें इकट्ठा करने और उन्हें सब इकट्ठा करने जा रहा हूं। हो सकता है कि मैं उन्हें किसी ब्लॉग या दूसरों के साथ साझा करने के लिए कुछ पोस्ट करता हूं। धन्यवाद। :) – user405821

1

मैं एक ही मुद्दे में चल रहा था और स्टीव एच द्वारा निम्नलिखित है कि बाहर में मदद मिली पाया:

क्या होता है कि डिबगर जुड़ा हुआ है जब, अपवाद लॉग जब तक आप डीबग परिप्रेक्ष्य के भीतर से एप्लिकेशन को समाप्त नहीं करते हैं, तब तक लॉगकैट पर पोस्ट न करें। यह होता है क्योंकि एप्लिकेशन वास्तव में क्रैश अलग होने तक क्रैश नहीं होता है। - स्टीव एच मार्च 31:47 15:47

------ yup, ऐसा हुआ। अब मैं एक ही अपवाद देखता हूं। इसके बाद मैंने प्रोग्राम को इसके पूर्ण क्रैश और बाहर निकलने की प्रक्रिया के माध्यम से चलाने दिया। इसे प्रदर्शित करना चाहिए कि जब यह मेरे प्रोग्राम को रोकता है और आईडीई डीबगर स्क्रीन लाता है। मुझे सोचने और मेरे समय को और अधिक क्लिक करने के साथ बर्बाद न करें। ग्रहण दृश्य स्टूडियो की पसंद के साथ प्रतिस्पर्धा करने के लिए ग्रहण करने का लंबा सफर तय करता है। आइए उम्मीद करें कि इसके लिए मेरा धैर्य मेरी परियोजना से बाहर है। प्रतिक्रिया के लिए धन्यवाद। :) - सेबस्टियन Dwornik मार्च 31 पर 17:35

प्रश्न के लिए लिंक: What's wrong with debugging in Eclipse on Android?