2012-06-27 16 views
9

मेरा एप्लिकेशन कहीं भी एक बल को बंद कर रहा है, लेकिन मेरे लॉगकैट में सामान्य (और बहुत ही जानकारीपूर्ण) स्टैक ट्रेस के साथ एक FATAL EXCEPTION प्राप्त करने के बजाय, मुझे केवल निम्न 4 पंक्तियां मिलती हैं:बिना किसी अपवाद के थ्रेड से बाहर निकलना: कोई स्टैक ट्रेस

06-27 07:08:54.546: D/dalvikvm(14351): GC_FOR_MALLOC freed 9923 objects/657416 bytes in 21ms 
06-27 07:08:54.769: W/dalvikvm(14351): threadid=20: thread exiting with uncaught exception (group=0x4001d7f0) 
06-27 07:08:54.796: W/dalvikvm(14351): threadid=21: thread exiting with uncaught exception (group=0x4001d7f0) 
06-27 07:08:54.796: I/Process(14351): Sending signal. PID: 14351 SIG: 9 

यह LogCat पर बिना किसी फ़िल्टर वाली डिबग मोड में है!

  • इस व्यवहार के कारण क्या हो सकता है?
  • क्या यह अपवाद पैदा करने का कोई तरीका है?

अद्यतन: नीचे @assylias के लिए धन्यवाद, मैं लागू करने में सक्षम किया गया है:

final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler(); 
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread paramThread, Throwable paramThrowable) { 
    Log.getStackTraceString(paramThrowable); 

    subclass.uncaughtException(paramThread, paramThrowable); 
    } 
}); 

इनमें से कौन सा जोड़ा लाइनों का उत्पादन:

06-27 08:24:47.105: D/dalvikvm(15475): GC_FOR_MALLOC freed 13865 objects/1435952 bytes in 45ms 
06-27 08:24:47.136: I/dalvikvm(15475): threadid=15: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 
06-27 08:24:47.136: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x45209338 (56 left) 
06-27 08:24:47.140: I/dalvikvm(15475): expanding stack end (0x45209300 to 0x45209000) 
06-27 08:24:47.140: I/dalvikvm(15475): Shrank stack (to 0x45209300, curFrame is 0x4520937c) 
06-27 08:24:47.159: I/dalvikvm(15475): threadid=16: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 
06-27 08:24:47.159: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520c338 (56 left) 
06-27 08:24:47.167: I/dalvikvm(15475): expanding stack end (0x4520c300 to 0x4520c000) 
06-27 08:24:47.167: I/dalvikvm(15475): Shrank stack (to 0x4520c300, curFrame is 0x4520c37c) 
06-27 08:24:47.175: I/dalvikvm(15475): threadid=17: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 
06-27 08:24:47.175: I/dalvikvm(15475): method requires 28+20+20=68 bytes, fp is 0x4520f338 (56 left) 
06-27 08:24:47.175: I/dalvikvm(15475): expanding stack end (0x4520f300 to 0x4520f000) 
06-27 08:24:47.175: I/dalvikvm(15475): Shrank stack (to 0x4520f300, curFrame is 0x4520f37c) 

यह निश्चित रूप भी बहुत कुछ उपयोगी है सूचना, लेकिन अब मैं निम्नलिखित के साथ संघर्ष कर रहा हूं:

  • subclass.uncaughtException() पर कॉल के बावजूद एप्लिकेशन अब बल-बंद नहीं करता है। क्यूं कर?
  • उन सभी ढेर ओवरफ्लो का अर्थ क्या है? मैं अपने गरीब एंड्रॉइड टेस्ट डिवाइस पर ऐसा कर क्या कर सकता हूं?
  • मैं कैसे बता सकता हूं कि मेरे कोड में कौन सा हिस्सा इसका कारण बनता है?

अद्यतन:Log.getStackTraceString(paramThrowable); वास्तव में कुछ भी मुद्रण नहीं था। मुझे प्राप्त अतिरिक्त प्रिंट bogus subclass.uncaughtException (paramThread, paramThrowable) से था; पूर्ण स्टैक ट्रेस लॉगिंग का सही तरीका Log.e(TAG, "uncaughtException", throwable) का उपयोग कर है।

अब एकमात्र प्रश्न यह है कि मैं अपवाद को फिर से कैसे फेंक सकता हूं? बस throw paramThrowable करें?

मेरे आखिरी प्रश्न का उत्तर दें: ग्रहण मुझे कोशिश/पकड़ के साथ आसपास के बिना फेंकने नहीं देगा, जिससे मुझे यह समझने में मदद मिली कि मैं जो चाहता हूं वह फिर से फेंक नहीं है लेकिन killProcess() है। समस्या सुलझ गयी।

+0

शायद आपके कोड के लिए प्रयास करने का प्रयास करने से पहचानने में मदद मिलेगी। –

+0

@Mukund मेरे कोड में कहां? मैं पहले से ही कई जगहों पर कई प्रयास/पकड़ खंडों का उपयोग कर रहा हूं। –

+0

एक .java फ़ाइल में पूरे कोड के आस-पास, नीचे दिए गए उत्तर के रूप में अधिक सामान्य प्रयास को पकड़ें। –

उत्तर

18

आप अपने ऐप की शुरुआत में एक डिफ़ॉल्ट ध्यान में न आया अपवाद संचालक की स्थापना की और वहाँ में कुछ डेटा लॉग इन करें (नीचे दिए गए उदाहरण एक जावा लकड़हारा उपयोग कर रहा है, लेकिन आसान Android के लिए स्थानांतरित करने के लिए) हो सकता है:

private static void setDefaultUncaughtExceptionHandler() { 
    try { 
     Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

      @Override 
      public void uncaughtException(Thread t, Throwable e) { 
       logger.error("Uncaught Exception detected in thread {}", t, e); 
      } 
     }); 
    } catch (SecurityException e) { 
     logger.error("Could not set the Default Uncaught Exception Handler", e); 
    } 
} 
+0

धन्यवाद +1। मैं कसम खाता हूं कि एंड्रॉइड पहले से ही एक डिफ़ॉल्ट अपूर्ण अपवाद हैंडलर प्रदान करता है लेकिन मुझे गलत हो सकता है। मैं जल्द ही [आपके दृष्टिकोण] (http://stackoverflow.com/a/8877177/562776) आज़माउंगा। –

+1

@EternalLearner मैं एंड्रॉइड के साथ पर्याप्त परिचित नहीं हूं यह जानने के लिए कि क्या यह मामला है। एंड्रॉइड पर लागू एक समान दृष्टिकोण के लिए [यह एक अलग प्रश्न का उत्तर] देखें (http://stackoverflow.com/a/755151/829571) (लेकिन शायद आपके उपयोग के लिए भी जटिल!)। – assylias

+0

आपका उत्तर स्वीकार करने जा रहा है क्योंकि यह स्पष्ट रूप से मुझे अपने समस्या निवारण प्रयासों में प्रगति करने की अनुमति देता है। हालांकि, मैं अभी भी कुछ मुद्दों से जूझ रहा हूं। ऊपर मेरा अपडेट देखें। +1। –

2

यह कठिन हो जाएगा, लेकिन जब तक यह डीबगर के साथ टूटता है तब तक मैं एक कदम आगे बढ़ता हूं। तो आप ताकि आप का निदान आप समस्या हो मदद मिल सकती है एक अधिक सामान्य पकड़

पकड़ (अपवाद ई) {}

सभी अपवाद अपवाद से विस्तार जोड़ सकते हैं।

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

+0

अपवाद संदेशों से ठीक पहले GC_FOR_MALLOC संदेश को ध्यान में रखने के लिए धन्यवाद +1 । मुझे नहीं लगता था कि यह प्रासंगिक था इसलिए मैंने इसे पोस्ट नहीं किया। अब जब आपने इस संभावना का उल्लेख किया है, तो मैंने अपना प्रश्न अपडेट किया है। मैं देखूंगा कि आपकी तकनीक मेरे लिए काम करती है या नहीं। –

+0

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

0

मैं यह जानता हूँ पुराना है लेकिन अगर कोई और बेकार अपवाद से निपटने के बाद सामान्य से बाहर निकलने के बारे में जानना चाहता है:

final Thread.UncaughtExceptionHandler androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); 

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(final Thread thread, final Throwable ex) { 
       // Handle exception however you want, then: 
       androidDefaultUEH.uncaughtException(thread, ex); 
      } 
     }); 
संबंधित मुद्दे