मैं अपने Android एप्लिकेशन से क्रैश-डेटा कैसे प्राप्त करूं?


737

मैं अपने Android एप्लिकेशन से क्रैश डेटा (कम से कम स्टैक के निशान) कैसे प्राप्त कर सकता हूं? कम से कम जब मेरे अपने डिवाइस पर केबल द्वारा पुनर्प्राप्त किया जा रहा है, लेकिन आदर्श रूप से जंगली पर चल रहे मेरे आवेदन के किसी भी उदाहरण से ताकि मैं इसे बेहतर बना सकूं और इसे और अधिक ठोस बना सकूं।


10
इसे देखें: github.com/tomquist/Android-Error-Reporter
Tom

मैं देखता हूं कि यह रिपोर्ट दूरस्थ सर्वर को भेजता है। क्या यह एक स्थानीय फ़ाइल के अपवाद को भी लॉग कर सकता है?

1
एंड्रॉइड कोड के लिए एप्लीकेशन क्रैश रिपोर्ट।
Googlep

यह एक और अधिक मजबूत लग रहा है, क्या होगा अगर रिपोर्टिंग सभी रिट्रीट के बाद अपलोड करने में विफल रहती है, तो क्या यह फ़ाइल या साइक्लाइट डीबी लॉग कर सकता है?
JPM

जवाबों:


354

आप ACRA (Android के लिए एप्लिकेशन क्रैश रिपोर्ट) लाइब्रेरी आज़मा सकते हैं :

ACRA एक ऐसी लाइब्रेरी है जो Android एप्लिकेशन को Google क्रैश फॉर्म में अपनी क्रैश रिपोर्ट को स्वचालित रूप से पोस्ट करने में सक्षम बनाती है। इसे क्रैश करने या गलत तरीके से व्यवहार करने पर अपने एप्लिकेशन से डेटा प्राप्त करने में मदद करने के लिए Android एप्लिकेशन डेवलपर्स को लक्षित किया जाता है।

आपके एप्लिकेशन में इंस्टॉल करना आसान है, बहुत ही कॉन्फ़िगर करने योग्य है और इसके लिए आपको कहीं भी सर्वर स्क्रिप्ट की मेजबानी करने की आवश्यकता नहीं है ... रिपोर्ट Google Dread स्प्रैडशीट को भेजी जाती हैं!


8
यह सेटअप और उपयोग करना आसान है। प्री-मार्केट प्लेस उपयोग के लिए अनुशंसित, और संभवतः बाद में भी।
mxcl

1
इसका उपयोग करना शुरू कर दिया है और यह inurensurably Flurry में त्रुटि रिपोर्टिंग की तुलना में बेहतर है जो मैंने पहले की थी या घर का बना था जिसे मैंने शुरू किया था। अब तक, मैं "एकरा" पर अटका हुआ हूं।
एड्रियन स्पाइन

8
एकरा का बड़ा फायदा यह है कि डेटा का आसानी से विश्लेषण और कल्पना करने के लिए Google API का उपयोग करने की संभावना है, इसे कैसे करें, इस पर उदाहरण के लिए jberkel.github.com/sms-backup-plus/acra-analysis देखें ।
जन बर्केल 20

3
मेरे लिए बहुत अस्थिर लगता है। ACRA स्वयं दुर्घटनाग्रस्त हो गया और अपने बारे में क्रैश रिपोर्ट भेज दी न कि संबंधित ऐप क्रैश की। -1
सैंडर

19
Google डॉक्स को बैकएंड के रूप में समर्थित नहीं किया गया है
eliocs

305

नमूना अनुप्रयोगों और डिबगिंग उद्देश्यों के लिए, मैं एक सरल समाधान का उपयोग करता हूं जो मुझे डिवाइस के एसडी कार्ड के स्टैकट्रेस को लिखने और / या सर्वर पर अपलोड करने की अनुमति देता है। यह समाधान प्रोजेक्ट एंड्रॉइड-रिमोट-स्टाट्रेस (विशेष रूप से, सेव-टू-डिवाइस और अपलोड-टू-सर्वर पार्ट्स) से प्रेरित है और मुझे लगता है कि यह सूनिल द्वारा बताई गई समस्या को हल करता है। यह इष्टतम नहीं है, लेकिन यह काम करता है और आप इसे बेहतर बना सकते हैं यदि आप इसे उत्पादन एप्लिकेशन में उपयोग करना चाहते हैं। यदि आप सर्वर को स्टैकट्रैक अपलोड करने का निर्णय लेते हैं, तो आप index.phpउन्हें देखने के लिए php स्क्रिप्ट ( ) का उपयोग कर सकते हैं। यदि आप रुचि रखते हैं, तो आप नीचे दिए गए सभी स्रोत पा सकते हैं - आपके एप्लिकेशन के लिए एक जावा क्लास और अपलोड किए गए स्टैकट्रैक की मेजबानी करने वाले सर्वर के लिए दो वैकल्पिक php स्क्रैप।

एक संदर्भ में (उदाहरण के लिए मुख्य गतिविधि), कॉल करें

if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            "/sdcard/<desired_local_path>", "http://<desired_url>/upload.php"));
}

CustomExceptionHandler

public class CustomExceptionHandler implements UncaughtExceptionHandler {

    private UncaughtExceptionHandler defaultUEH;

    private String localPath;

    private String url;

    /* 
     * if any of the parameters is null, the respective functionality 
     * will not be used 
     */
    public CustomExceptionHandler(String localPath, String url) {
        this.localPath = localPath;
        this.url = url;
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }

    public void uncaughtException(Thread t, Throwable e) {
        String timestamp = TimestampFormatter.getInstance().getTimestamp();
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = timestamp + ".stacktrace";

        if (localPath != null) {
            writeToFile(stacktrace, filename);
        }
        if (url != null) {
            sendToServer(stacktrace, filename);
        }

        defaultUEH.uncaughtException(t, e);
    }

    private void writeToFile(String stacktrace, String filename) {
        try {
            BufferedWriter bos = new BufferedWriter(new FileWriter(
                    localPath + "/" + filename));
            bos.write(stacktrace);
            bos.flush();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sendToServer(String stacktrace, String filename) {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("filename", filename));
        nvps.add(new BasicNameValuePair("stacktrace", stacktrace));
        try {
            httpPost.setEntity(
                    new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            httpClient.execute(httpPost);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

upload.php

<?php
    $filename = isset($_POST['filename']) ? $_POST['filename'] : "";
    $message = isset($_POST['stacktrace']) ? $_POST['stacktrace'] : "";
    if (!ereg('^[-a-zA-Z0-9_. ]+$', $filename) || $message == ""){
        die("This script is used to log debug data. Please send the "
                . "logging message and a filename as POST variables.");
    }
    file_put_contents($filename, $message . "\n", FILE_APPEND);
?>

index.php

<?php
    $myDirectory = opendir(".");
    while($entryName = readdir($myDirectory)) {
        $dirArray[] = $entryName;
    }
    closedir($myDirectory);
    $indexCount = count($dirArray);
    sort($dirArray);
    print("<TABLE border=1 cellpadding=5 cellspacing=0 \n");
    print("<TR><TH>Filename</TH><TH>Filetype</th><th>Filesize</TH></TR>\n");
    for($index=0; $index < $indexCount; $index++) {
        if ((substr("$dirArray[$index]", 0, 1) != ".") 
                && (strrpos("$dirArray[$index]", ".stacktrace") != false)){ 
            print("<TR><TD>");
            print("<a href=\"$dirArray[$index]\">$dirArray[$index]</a>");
            print("</TD><TD>");
            print(filetype($dirArray[$index]));
            print("</TD><TD>");
            print(filesize($dirArray[$index]));
            print("</TD></TR>\n");
        }
    }
    print("</TABLE>\n");
?>

9
मुझे लगता है कि इससे कुछ राज्यों / देशों में कानूनी मुद्दे पैदा होंगे
सेटज़ामोरा

5
नोट: HttpPost httpPost = new HttpPost(url);यदि आप हनीकॉम्ब या बाद में लक्ष्य कर रहे हैं, तो एक async कार्य (या हैंडलर ... एक अलग धागा) में होना चाहिए
ब्रायन डेनी

4
@ जोसेट, किस तरह के कानूनी मुद्दे हैं, और क्यों?
varevarao

2
@varevarao कानूनी मुद्दे (हो सकता है) क्योंकि आप इस कोड के सेंड-टू-सर्वर फ़ीचर का उपयोग करके उपयोगकर्ता की सहमति के बिना संवेदनशील डिवाइस जानकारी भेज रहे हैं।
caw

2
DefaultExceptionHandler गतिविधि मनोरंजन के दौरान बनी रहती है। यदि कस्टम हैंडलर पहले से सेट नहीं है, तो मैंने केवल डिफ़ॉल्ट को सेट करने के लिए उत्तर अपडेट किया है। इसके बिना, प्रत्येक हैंडलर पिछले एक को रखता है और कॉल करता है, सभी मूल एक को। यह डुप्लिकेट लॉगिंग के साथ-साथ मेमोरी लीक के मुद्दों के कारण होता है।
डेव मैक्लेलैंड

57

आप [BugSense] कारण भी आज़मा सकते हैं : स्पैम एक अन्य url पर रीडायरेक्ट करता है । BugSense सभी दुर्घटना रिपोर्टों का संग्रह और विश्लेषण करता है और आपको सार्थक और दृश्य रिपोर्ट देता है। यह मुफ़्त है और इसे एकीकृत करने के लिए कोड की केवल 1 पंक्ति है।

डिस्क्लेमर: मैं एक सह-संस्थापक हूं


4
मैंने BugSense और इसके कमाल की कोशिश की है। सरल और ताजा यूआई, बहुत जल्दी। कोई बेवकूफ सुविधा नहीं है। सबसे लगातार दुर्घटनाओं को देखने के लिए आसान और स्टैकट्रेस में खुदाई करने के लिए भी।
vidstige

हम हाल ही में क्रैश रिपोर्ट की तुलना में बहुत कुछ करते हैं लेकिन नई सुविधाओं आदि पर बात करने के लिए यह सही जगह नहीं है
PanosJee

इसे आजमाया। त्रुटियों ने काम किया हालांकि स्टैकट्रेस बहुत पूर्ण नहीं है, वास्तविक समय क्रैश डेटा के माध्यम से नहीं आया था। डिबग मोड काम नहीं किया। मैं अनुप्रयोग वर्ग से प्रारंभिक-एक बार मार्ग से नीचे चला गया, हालांकि (जो ज्यादातर मामलों के लिए समझ में आता है)। BugSense में एक अद्भुत डैशबोर्ड है, ऐसा शर्म की बात है कि किसी कारण से क्रैश रिपोर्ट काम नहीं करती है और प्रतीक मुक्त टियर में नहीं है। GetSentry को स्थापित करने के लिए मुझे 5 मिनट का समय लगा और इस सामान्य प्रयोजन ग्राहक के साथ एंड्रॉइड के लिए बस बॉक्स से बाहर काम किया: github.com/joshdholtz/Sentry-Android
अल्बर्टपेइरो

3
BugSense सरल और एकीकृत करने के लिए आसान है। लेकिन यह बहुत महत्वपूर्ण है। हम Flurry analytics और Parse का उपयोग करके समान बग अर्थ कार्यक्षमताएँ प्राप्त कर सकते हैं। वे दोनों स्वतंत्र और एकीकृत करने में आसान हैं।
वेंकट

44

Android 2.2 में अब Android Market एप्लिकेशन से क्रैश रिपोर्ट स्वचालित रूप से प्राप्त करना संभव है:

एंड्रॉइड मार्केट ऐप्स के लिए नई बग रिपोर्टिंग सुविधा डेवलपर्स को क्रैश प्राप्त करने और अपने उपयोगकर्ताओं से रिपोर्ट फ्रीज करने में सक्षम बनाती है। जब वे अपने प्रकाशक खाते में प्रवेश करेंगे तो रिपोर्ट उपलब्ध होगी।

http://developer.android.com/sdk/android-2.2-highlights.html


मुझे लगता है कि यह सिर्फ 2.2 नहीं है, बल्कि बस एक नए बाजार की सुविधा वाला Google ऑफ़र है। मुझे कुछ दिनों पहले एक क्रैशपोर्ट मिला और मेरे ऐप का उपयोग करते हुए एक फरो डिवाइस नहीं होना चाहिए।
Janusz

1
@ जानुसज़ क्या आपको यकीन है? नेक्सस वन के लिए पहले से ही Froyo के रिलीज हैं, बिना गोगलर्स की गिनती के बिना जो थोड़ी देर के लिए Froyo चला रहे हैं।
पुतीनो

कम से कम फोन पर संस्करण में एक अपडेट होना चाहिए, यहां तक ​​कि इसका सिर्फ एक और संशोधन है, लेकिन यह कैसे काम करना चाहिए?
RoflcoptrException

मुझे नहीं पता कि रिपोर्ट को Google को पहले भेजा गया था या नहीं। रिपोर्ट कुछ अजीब है क्योंकि Google अपने वीडियो में भेजने के लिए एक यूआई दिखाता है और उसे ओएस में बदलाव करना पड़ता है और न केवल बाजार में। लेकिन यह कहता है: प्लेटफ़ॉर्म 1 रिपोर्ट / सप्ताह रिपोर्ट करता है और ड्रॉइड फ़ेरो पर नहीं होना चाहिए।
Janusz

1
"रिपोर्ट" बटन कोड थोड़ी देर के लिए एओएसपी में रहा है, और रोमेन गाइ (अस्पष्ट) ने कुछ महीने पहले यहां इस बारे में एक सवाल का जवाब दिया था।
क्रिस्टोफर ओर्र

30

इन अपवादों को संभालना संभव है Thread.setDefaultUncaughtExceptionHandler(), हालाँकि यह अपवादों को संभालने की Android की विधि के साथ खिलवाड़ करता प्रतीत होता है। मैंने इस प्रकृति के हैंडलर का उपयोग करने का प्रयास किया:

private class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread thread, Throwable ex){
        Log.e(Constants.TAG, "uncaught_exception_handler: uncaught exception in thread " + thread.getName(), ex);

        //hack to rethrow unchecked exceptions
        if(ex instanceof RuntimeException)
            throw (RuntimeException)ex;
        if(ex instanceof Error)
            throw (Error)ex;

        //this should really never happen
        Log.e(Constants.TAG, "uncaught_exception handler: unable to rethrow checked exception");
    }
}

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


आप केवल अनियंत्रित अपवादों को फिर से क्यों फेंक रहे हैं? ऐसा लगता है कि आपको सभी अपवादों को फिर से फेंकना चाहिए।
MatrixFrog

ऐसा लगता है कि कोई व्यक्ति आपके दृष्टिकोण से सफल हुआ: jyro.blogspot.com/2009/09/crash-report-for-android-app.html
MatrixFrog

1
चाल पिछले डिफ़ॉल्ट अनक्रेडिसेप्शनहैंडलर को प्राप्त करने और अपवाद को रिपोर्ट करने के बाद उस ऑब्जेक्ट को अपवाद को संभालने के लिए है।
टॉम

है Constants.TAGएंड्रॉयड ढांचे का हिस्सा है? पहली बार इसे देखकर। इसे खोजने के लिए प्रतीत नहीं कर सकते।
हरून हजम

1
@HarounHajem हमें अपने स्वयं को परिभाषित करने की आवश्यकता है।
KYHSGeekCode

22

मैं देख रहा हूं कि प्रश्न बहुत पुराना है, और आशा है कि मेरा उत्तर अन्य लोगों के लिए भी यही समस्या है ...

दे दो Crashlytics एक कोशिश। यह आपके आवेदन करने वाले सभी उपकरणों पर सभी दुर्घटनाओं में अदम्य अंतर्दृष्टि देगा और आपको ईमेल के माध्यम से एक सूचना भेजेगा..और सबसे अच्छा हिस्सा इसका उपयोग करने के लिए पूरी तरह से स्वतंत्र है।


21

ठीक है, अच्छी तरह से मैंने rrainn और सूनिल से प्रदान किए गए नमूनों को देखा, और मुझे एक समाधान मिला जो त्रुटि से निपटने में गड़बड़ नहीं करता है।

मैंने CustomExceptionHandler को संशोधित किया है, इसलिए यह मूल UncaughtExceptionHandler को थ्रेड से संग्रहीत करता है जिसे हम नए को जोड़ते हैं। नए "अनक्रेडिसेप्शन" के अंत में - विधि मैं सिर्फ पुराने संग्रह को अनक्रेडेडएक्सडैसेप्शनहैंडलर का उपयोग करके कॉल करता हूं।

DefaultExceptionHandler वर्ग में आपको sth की आवश्यकता होती है। इस तरह:

public class DefaultExceptionHandler implements UncaughtExceptionHandler{
  private UncaughtExceptionHandler mDefaultExceptionHandler;

  //constructor
  public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler)
  {
       mDefaultExceptionHandler= pDefaultExceptionHandler;
  }
  public void uncaughtException(Thread t, Throwable e) {       
        //do some action like writing to file or upload somewhere         

        //call original handler  
        mStandardEH.uncaughtException(t, e);        

        // cleanup, don't know if really required
        t.getThreadGroup().destroy();
  }
}

Http://code.google.com/p/android-remote-stacktrace पर कोड में उस संशोधन के साथ आपके वेबसर्वर या एसडी-कार्ड के लिए फ़ील्ड में लॉग इन करने के लिए आपके पास एक अच्छा काम करने का आधार है।


19

Google Play Developers कंसोल वास्तव में आपको उन ऐप्स से स्टैक के निशान देता है जो दुर्घटनाग्रस्त हो गए हैं और रिपोर्ट भेज दिए हैं, यह जानकारी देखने में आपकी मदद करने के लिए एक बहुत अच्छा चार्ट भी है, नीचे उदाहरण देखें:

यहां छवि विवरण दर्ज करें


2
आपके पास उपयोगकर्ता कैसे रिपोर्ट भेजते हैं या यह कैसे काम करता है यदि आपका ऐप प्ले स्टोर में नहीं है, तो क्या आप इसे परीक्षण उद्देश्यों के लिए कर सकते हैं?
सिंह 89

क्या आप जानते हैं कि कोई भी ओपन सोर्स एंड्रॉइड प्रोजेक्ट है जो उनकी क्रैश रिपोर्ट को सार्वजनिक करता है?
जस्टिन सिवि

1
कृपया ध्यान दें, यह केवल क्रैश दिखाएगा, ANR जिसे उपयोगकर्ताओं ने रिपोर्ट करने के लिए चुना
sojin

हाँ वास्तव में, वैसे भी जब आपके पास एक बड़ा उपयोगकर्ता आधार होता है, तो आपके पास सभी क्रैश की संभावनाएँ होने की बहुत संभावनाएँ होती हैं, और क्रैश और ANR की रिपोर्ट यहाँ भी सबसे महत्वपूर्ण होगी, क्योंकि लोग उन्हें अधिक बार रिपोर्ट करेंगे, ताकि आप इस तरह से उस प्राथमिकता में फ़िल्टर करें और उन्हें ठीक करें (अधिक रिपोर्ट = अधिक महत्वपूर्ण बग) जबकि (कोई रिपोर्ट नहीं = उस महत्वपूर्ण बग नहीं)।
एफर्ट

18

मैं अपने एंड्रॉइड और iOS ऐप के लिए Crittercism का उपयोग कर रहा हूं - उनके बारे में टेक्नक्रंच पर सुना। उनके साथ अब तक बहुत खुश!


FYI करें: NDK की ओर से क्रैश रिपोर्टें मूल योजना का हिस्सा नहीं हैं, और "विस्तारित क्रैश रिपोर्टिंग" के अंतर्गत आती हैं। देखें: crittercism.com/pricing
ahash

1
मैंने अभी-अभी NDK को Twitter के Fabric.io Crashlytics पर रिपोर्टिंग की ... बहुत बढ़िया (उपयोग के 1 दिन) पर, यह एक अतिरिक्त कदम की आवश्यकता थी जब मैं मैपिंग को उनके सिस्टम में डालने के लिए रिलीज़ करता हूं ताकि स्टैक के निशान अच्छे दिखें, लेकिन यह नस्ट हो गया NDK त्रुटि जिसका मैंने परीक्षण किया था (सी "एबोर्ट () बनाया"; सी + + में रणनीतिक रूप से कॉल किया और इसने परीक्षण के लिए एक स्टैक ट्रेस प्रदान किया।
हंटर-ओरियनोइर

14

मैंने यहां अपना संस्करण बनाया: http://androidblogger.blogspot.com/2009/12/how-to-improve-your-application-crash.html

यह मूल रूप से एक ही बात है, लेकिन मैं रिपोर्ट भेजने के लिए http कॉन्सेप्शन के बजाय एक मेल का उपयोग कर रहा हूं, और, अधिक महत्वपूर्ण बात, मैंने अपनी रिपोर्ट में एप्लिकेशन संस्करण, ओएस संस्करण, फोन मॉडल या हिमस्खलन मेमोरी जैसे कुछ संकेत जोड़े। ।


11

इसका उपयोग अपवाद विवरणों को पकड़ने के लिए करें:

String stackTrace = Log.getStackTraceString(exception); 

डेटाबेस में इसे स्टोर करें और लॉग को बनाए रखें।


उस डेटा बेस का उपयोग कैसे करें, क्या आप मुझे कोई उदाहरण देंगे। आप कर सकते हैं तो कृपया। advacne में धन्यवाद
राजेंद्र वर्मा

8

आप केवल लाइब्रेरी के बजाय इसके लिए एक संपूर्ण (सरल) सेवा का उपयोग कर सकते हैं। हमारी कंपनी ने बस उसके लिए एक सेवा जारी की: http://apphance.com

इसमें एक सरल .jar पुस्तकालय (Android के लिए) है जिसे आप 5 मिनट में जोड़ते हैं और एकीकृत करते हैं और फिर पुस्तकालय न केवल क्रैश जानकारी एकत्र करता है, बल्कि रनिंग एप्लिकेशन से भी लॉग होता है, साथ ही यह आपके परीक्षकों को डिवाइस से सीधे समस्याओं की रिपोर्ट करने देता है - जिसमें डिवाइस भी शामिल है पूरे संदर्भ (डिवाइस रोटेशन, चाहे वह वाईफाई से जुड़ा हो या नहीं और अधिक)। आप एक बहुत अच्छे और उपयोगी वेब पैनल का उपयोग करके लॉग को देख सकते हैं, जहां आप अपने एप्लिकेशन, क्रैश, लॉग, आंकड़े और बहुत कुछ के साथ सत्रों को ट्रैक कर सकते हैं। सेवा अभी बंद बीटा परीक्षण चरण में है, लेकिन आप पहुंच का अनुरोध कर सकते हैं और हम इसे आपको बहुत जल्दी देते हैं।

अस्वीकरण: मैं पॉलिडा का सीटीओ हूं, और सेवा का सह-निर्माता हूं।


7

धन्यवाद संसाधन Stackoverflowइस उत्तर को खोजने में मेरी मदद करने में मौजूद हैं ।

आप अपने ईमेल में सीधे अपनी दूरस्थ Android क्रैश रिपोर्ट पा सकते हैं । याद रखें कि आपको अपना ईमेल CustomExceptionHandler वर्ग के अंदर रखना है

public static String sendErrorLogsTo = "tushar.pandey@virtualxcellence.com" ;

आवश्यक कदम:

1) अपनी गतिविधि के onCreate में अपने कोड के इस भाग का उपयोग करें।

    if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
        Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(this));
    }   

2) मेरे phpscript के अनुसार (rrainn) के CustomExceptionHandler वर्ग के इस ओवरराइड संस्करण का उपयोग करें।

package com.vxmobilecomm.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.AsyncTask;
import android.util.Log;

public class CustomExceptionHandler implements UncaughtExceptionHandler {

    private UncaughtExceptionHandler defaultUEH;
    public static String sendErrorLogsTo = "tushar.pandey@virtualxcellence.com" ;

    Activity activity;

    public CustomExceptionHandler(Activity activity) {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        this.activity = activity;
    }

    public void uncaughtException(Thread t, Throwable e) {

        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = "error" + System.nanoTime() + ".stacktrace";

        Log.e("Hi", "url != null");
        sendToServer(stacktrace, filename);

        StackTraceElement[] arr = e.getStackTrace();
        String report = e.toString() + "\n\n";
        report += "--------- Stack trace ---------\n\n";
        for (int i = 0; i < arr.length; i++) {
            report += "    " + arr[i].toString() + "\n";
        }
        report += "-------------------------------\n\n";

        report += "--------- Cause ---------\n\n";
        Throwable cause = e.getCause();
        if (cause != null) {
            report += cause.toString() + "\n\n";
            arr = cause.getStackTrace();
            for (int i = 0; i < arr.length; i++) {
                report += "    " + arr[i].toString() + "\n";
            }
        }
        report += "-------------------------------\n\n";

        defaultUEH.uncaughtException(t, e);
    }

    private void sendToServer(String stacktrace, String filename) {
        AsyncTaskClass async = new AsyncTaskClass(stacktrace, filename,
                getAppLable(activity));
        async.execute("");
    }

    public String getAppLable(Context pContext) {
        PackageManager lPackageManager = pContext.getPackageManager();
        ApplicationInfo lApplicationInfo = null;
        try {
            lApplicationInfo = lPackageManager.getApplicationInfo(
                    pContext.getApplicationInfo().packageName, 0);
        } catch (final NameNotFoundException e) {
        }
        return (String) (lApplicationInfo != null ? lPackageManager
                .getApplicationLabel(lApplicationInfo) : "Unknown");
    }

    public class AsyncTaskClass extends AsyncTask<String, String, InputStream> {
        InputStream is = null;
        String stacktrace;
        final String filename;
        String applicationName;

        AsyncTaskClass(final String stacktrace, final String filename,
                String applicationName) {
            this.applicationName = applicationName;
            this.stacktrace = stacktrace;
            this.filename = filename;
        }

        @Override
        protected InputStream doInBackground(String... params) 
        { 
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                    "http://suo-yang.com/books/sendErrorLog/sendErrorLogs.php?");

            Log.i("Error", stacktrace);

            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                        6);

                nameValuePairs.add(new BasicNameValuePair("data", stacktrace));
                nameValuePairs.add(new BasicNameValuePair("to",sendErrorLogsTo));
                nameValuePairs.add(new BasicNameValuePair("subject",applicationName));

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                HttpResponse response = httpclient.execute(httppost);

                HttpEntity entity1 = response.getEntity();

                BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
                        entity1);

                is = bufHttpEntity.getContent();

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return is;
        }

        @Override
        protected void onPostExecute(InputStream result) {
            super.onPostExecute(result);

            Log.e("Stream Data", getStringFromInputStream(is));
        }
    }

    // convert InputStream to String
    private static String getStringFromInputStream(InputStream is) {

        BufferedReader br = null;
        StringBuilder sb = new StringBuilder();

        String line;
        try {

            br = new BufferedReader(new InputStreamReader(is));
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return sb.toString();

    }
}


5

यह बहुत ही क्रूर है, लेकिन कहीं भी logcat चलाना संभव है, इसलिए किसी भी पकड़ ब्लॉक में एक त्वरित और गंदी हैक को जोड़ना है getRuntime().exec("logcat >> /sdcard/logcat.log");


यह सभी ऐप्स का लॉग आउटपुट देगा। App tagname को छानना ठीक हो सकता है लेकिन यह मत सोचो कि यह एक अच्छा तरीका होगा क्योंकि प्रविष्टियाँ संचयी हो सकती हैं। प्रत्येक लिखने के बाद logcat आउटपुट को क्लीयर करने से वह समस्या हल हो सकती है।
bschandramohan

5

एक उपकरण है जिसे फैब्रिक कहा जाता है, यह एक क्रैश एनालिटिक टूल है, जो आपको एप्लिकेशन और लाइव विकास के दौरान, क्रैश रिपोर्ट प्राप्त करने की अनुमति देगा। इस टूल को अपने एप्लिकेशन में जोड़ना सरल था और साथ ही .. जब आपका एप्लिकेशन क्रैश हो जाता है तो क्रैश की रिपोर्ट आपके fabric.io डैशबोर्ड से देखी जा सकती है। thw रिपोर्ट स्वचालित रूप से पकड़ी गई थी। यह उपयोगकर्ता से अनुमति नहीं मांगेगी। वह बग / क्रैश रिपोर्ट भेजना चाहता है या नहीं। और यह पूरी तरह से नि: शुल्क है ... https://get.fabric.io/


5

Google Firebase आपके फ़ोन पर क्रैश / त्रुटि डेटा प्रदान करने के लिए Google का नवीनतम (2016) तरीका है। इसे अपनी build.gradle फ़ाइल में शामिल करें:

compile 'com.google.firebase:firebase-crash:9.0.0'

उपयोगकर्ता इनपुट की आवश्यकता के बिना घातक क्रैश स्वचालित रूप से लॉग इन होते हैं और आप गैर-घातक क्रैश या अन्य घटनाओं को भी लॉग इन कर सकते हैं:

try
{

}
catch(Exception ex)
{
    FirebaseCrash.report(new Exception(ex.toString()));
}

5

इस Android पुस्तकालय को शर्लक कहा जाता है । यह आपको डिवाइस और एप्लिकेशन की जानकारी के साथ दुर्घटना की पूरी रिपोर्ट देता है। जब भी कोई दुर्घटना होती है, तो वह सूचना पट्टी में एक सूचना प्रदर्शित करता है और अधिसूचना पर क्लिक करने पर यह दुर्घटना विवरण खोलता है। आप ईमेल या अन्य साझाकरण विकल्पों के माध्यम से दूसरों के साथ क्रैश विवरण भी साझा कर सकते हैं।

स्थापना

android {
    dataBinding {
      enabled = true
    }
}

compile('com.github.ajitsing:sherlock:1.0.0@aar') {
    transitive = true
}

डेमो

यहां छवि विवरण दर्ज करें


5

हालांकि इस पृष्ठ के कई उत्तर उपयोगी हैं, लेकिन उनके लिए पुराना होना आसान है। AppBrain वेबसाइट उन आँकड़ों को एकत्र करती है जो आपको वर्तमान में सबसे लोकप्रिय क्रैश रिपोर्टिंग समाधान खोजने की अनुमति देते हैं:

Android क्रैश रिपोर्टिंग लाइब्रेरी

ऐप ब्रेन वेबसाइट

आप देख सकते हैं कि इस तस्वीर को पोस्ट करते समय, 5.24% ऐप और 12.38% इंस्टॉल में Crashlytics का उपयोग किया जाता है।


4

हम कंपनी के अंदर अपने घर में विकसित प्रणाली का उपयोग करते हैं और यह हमारी बहुत अच्छी सेवा करता है। यह एक एंड्रॉइड लाइब्रेरी है जो सर्वर और सर्वर को क्रैश रिपोर्ट भेजता है जो रिपोर्ट प्राप्त करता है और कुछ एनालिटिक्स बनाता है। अपवाद नाम, स्टैकट्रेस, संदेश द्वारा सर्वर समूह अपवाद। यह सबसे महत्वपूर्ण मुद्दों की पहचान करने में मदद करता है जिन्हें ठीक करने की आवश्यकता है। हमारी सेवा अभी सार्वजनिक बीटा में है, इसलिए हर कोई इसे आज़मा सकता है। आप http://watchcat.co पर खाता बना सकते हैं या आप बस एक नज़र डाल सकते हैं कि यह डेमो एक्सेस http://watchcat.co/reports/index.php?demo का उपयोग करके कैसे काम करता है ।


3

यदि आप तुरंत उत्तर चाहते हैं तो आप logcat का उपयोग कर सकते हैं

$adb shell logcat -f /sdcard/logoutput.txt *:E

यदि अभी आपके लॉग में बहुत अधिक रद्दी है, तो पहले इसे साफ़ करने का प्रयास करें।

$adb shell logcat -c

फिर अपना ऐप चलाने की कोशिश करें फिर लॉगकैट करें।


क्या यह अभी भी आवश्यक नहीं है कि आप डिवाइस को एक पीसी (जैसे एक केबल के साथ) को हुक करें?
गेरार्ड

3

मुझे त्रुटि रिपोर्ट को ट्रैक करने के लिए एक और महान वेब एप्लिकेशन मिला।

https://mint.splunk.com/

कॉन्फ़िगर करने के लिए चरणों की छोटी संख्या।

  1. लॉगिन या साइन अप करें और उपरोक्त लिंक का उपयोग करके कॉन्फ़िगर करें। एक बार जब आप एक एप्लिकेशन बना लेते हैं तो वे नीचे की तरह कॉन्फ़िगर करने के लिए एक लाइन प्रदान करेंगे।
Mint.initAndStartSession(YourActivity.this, "api_key");
  1. आवेदन के build.gradl में निम्नलिखित जोड़ें।
android {
...
    repositories {
        maven { url "https://mint.splunk.com/gradle/"}
    }
...
}

dependencies {
...
    compile "com.splunk.mint:mint:4.4.0"
...
}
  1. उस कोड को जोड़ें जिसे हमने ऊपर कॉपी किया था और इसे हर गतिविधि में जोड़ दिया था।

    Mint.initAndStartSession (YourActivity.this, "api_key");

बस। आप लॉगिन और आप के लिए आवेदन डैशबोर्ड, आप सभी त्रुटि रिपोर्ट मिल जाएगा।

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


इस की कीमत क्या होगी?
user2966445

2

वैकल्पिक क्रैश रिपोर्टिंग / अपवाद ट्रैकिंग सेवा के लिए Raygun.io की जांच करें - यह एंड्रॉइड क्रैश से निपटने के लिए अच्छे तर्क का एक गुच्छा है, जिसमें सभ्य उपयोगकर्ता अनुभव भी शामिल है जब इसे अपने ऐप में प्लग करना है (आपकी मुख्य गतिविधि में कोड की दो लाइनें और कुछ। XML की पंक्तियों को AndroidManifest में चिपकाया गया)।

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

अस्वीकरण: मैंने Android प्रदाता बनाया :)


1

बस Google फॉर्म का उपयोग करके ACRA https://github.com/ACRA/acra का उपयोग बैकएंड के रूप में करना शुरू कर दिया है और इसे सेटअप करना और उपयोग करना बहुत आसान है, यह डिफ़ॉल्ट है।

Google प्रपत्रों को BUT भेजने की रिपोर्ट को निकाला जा रहा है (तब हटा दिया गया है): https://plus.google.com/118444843928759726538/posts/GTTgsrEQdN6 https://githg.com/ACRA/acra/wiki/Notice-on-Google -Form-स्प्रेडशीट-उपयोग

वैसे भी यह अपनी खुद की इस निर्धारित करना संभव है https://github.com/ACRA/acra/wiki/AdvancedUsage#wiki-Implementing_your_own_sender आप उदाहरण के लिए ईमेल भेजने वाले को एक कोशिश दे सकते हैं।

न्यूनतम प्रयास के साथ रिपोर्ट्स को बगैरह के भेजना संभव है: http://www.bugsense.com/docs/android#acra

NB असंवेदनशील खाता 500 रिपोर्ट / माह तक सीमित है


1

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

लिंक पोस्ट करने के लिए: https://androidician.wordpress.com/2015/03/29/sending-crash-reports-with-acra-over-email-use-mandrill/

जीथब पर नमूना परियोजना के लिए लिंक: https://github.com/ayushhgoyal/AcraSample


1

मैं Bugsnag के संस्थापकों में से एक हूं जिसे हमने इस उद्देश्य के लिए डिज़ाइन किया है। बग्सनाग स्वचालित रूप से एंड्रॉइड ऐप में अनचाहे अपवादों को पकड़ लेता है और उन्हें हमारे डैशबोर्ड पर भेजता है, जहां आप निदान को प्राथमिकता दे सकते हैं और नैदानिक ​​जानकारी में गोता लगा सकते हैं।

यहाँ कुछ महत्वपूर्ण बातों पर विचार करना है, जब कुछ कोड स्निपेट के साथ क्रैश रिपोर्टिंग सिस्टम का चयन या निर्माण करना है:

  • स्वतः अपवादित अपवादों का पता लगाता है ( उदाहरण कोड )
  • नैदानिक ​​डेटा एकत्र करता है जैसे कि मेमोरी उपयोग, डिवाइस जानकारी, आदि ( उदाहरण कोड )
  • प्रभावी रूप से समूह मूल कारण से एक साथ क्रैश होते हैं
  • आपको पुन: पेश करने में मदद करने के लिए प्रत्येक दुर्घटना से पहले उपयोगकर्ता को ट्रैक करने की अनुमति देता है ( उदाहरण कोड )

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


0

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


0

हड़बड़ाहट की एनालिटिक्स आपको क्रैश जानकारी, हार्डवेयर मॉडल, एंड्रॉइड वर्जन और लाइव ऐप उपयोग के आँकड़े देती है। नए एसडीके में वे अधिक विस्तृत दुर्घटना जानकारी प्रदान करते प्रतीत होते हैं http://www.flurry.com/flurry-crash-analytics.html


8
हड़बड़ी केवल इतने सारे किरदारों तक सीमित है और आपको कोई रेखाएँ या समान नहीं देता है।
ब्रायन डेनी

0

Google ने पाया कि वास्तव में आपको कितनी दुर्घटना रिपोर्ट मिलती है। पहले आपको केवल मैनुअल रिपोर्टेड बग रिपोर्ट मिलती थी।

पिछले डेवलपर सम्मेलन और Android Vitals की शुरूआत के बाद से आपको उन उपयोगकर्ताओं की क्रैश रिपोर्ट भी मिलती है, जिन्होंने निदान डेटा साझा करने में सक्षम किया है।

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

क्रैश और एप्लिकेशन को जवाब न देना (ANR) त्रुटियां


logcat कह रहा है कि /data/user/0/com.<myappname>/cache/WebView/Crash रिपोर्ट / <GUUID> .dmp में एक आउटपुट क्रैश डंप फ़ाइल है, लेकिन डिवाइस रूट नहीं किया गया है और मैं समझ नहीं सकता। कैसे इस फ़ाइल का उपयोग करने के लिए!
माइकल

0

आप इसे सीधे Android Studio में कर सकते हैं। बस अपने फोन को कनेक्ट करें, ऐप चलाएं, इसे क्रैश होने दें और आप सीधे स्टाटट्रेस को एंड्रॉइड स्टूडियो में देख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.