एंड्रॉइड क्रैश लॉग कैसे प्राप्त करें?


155

मेरे पास एक ऐप है जो बाज़ार में नहीं है (एक डीबग प्रमाणपत्र के साथ हस्ताक्षरित), लेकिन जब भी आपका एप्लिकेशन क्रैश होता है, तो क्रैश लॉग डेटा प्राप्त करना चाहते हैं। मुझे इसका लॉग कहां मिल सकता है कि मेरा ऐप क्रैश क्यों हुआ?

जवाबों:


139

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


2
क्या आप बता सकते हैं कि adb logcat कमांड का उपयोग कैसे करें? क्या मैं इसे / SDK / उपकरण निर्देशिका के अंदर चलाता हूं? क्या कोई झंडे हैं जिन पर मुझे ध्यान देना चाहिए? आदि
jesses.co.tt

2
@ jesses.co.tt हाँ, बस चलाने के adb logcatलिए जो भी निर्देशिका एडीबी में स्थित है से वैकल्पिक रूप से आप एसडीके उपकरण Eclipse प्लग में शामिल कर सकते हैं।
क्रिस थॉम्पसन

2
Crashlytics सबसे अच्छा दूरस्थ अपवाद लॉगिंग सॉफ़्टवेयर है जिसका मैंने कभी उपयोग किया है। यह मेरे सभी ऐप में जाता है, इसे देखें।
जैक्सनक्राट

adb.exe में स्थित है $SDK_DIR/platform-tools/। त्रुटि दिखाने के लिए:.\adb.exe logcat -v time *:E
हारुन

53

ऐसा करने का तरीका Thread.UncaughtExceptionHandlerइंटरफ़ेस को लागू करना है और इसे Thread.setDefaultUncaughtExceptionHandler()अपनी गतिविधि की शुरुआत में पास करना है onCreate()। यहाँ कार्यान्वयन वर्ग है TopExceptionHandler

public class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
    private Thread.UncaughtExceptionHandler defaultUEH;
    private Activity app = null;

    public TopExceptionHandler(Activity app) {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        this.app = app;
    }

    public void uncaughtException(Thread t, Throwable e) {
        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";

        // If the exception was thrown in a background thread inside
        // AsyncTask, then the actual exception can be found with getCause

        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";

        try {
            FileOutputStream trace = app.openFileOutput("stack.trace", 
                                                        Context.MODE_PRIVATE);
            trace.write(report.getBytes());
            trace.close();
        } catch(IOException ioe) {
        // ...
        }

        defaultUEH.uncaughtException(t, e);
    }
}

नोट हम एंड्रॉइड फ्रेमवर्क के डिफॉल्ट को इसे हैंडल करने देते हैं।

अपनी गतिविधि के शीर्ष पर इस तरह से ऊपर की कक्षा का एक उदाहरण दर्ज करें:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...

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

स्टैक ट्रेस को ईमेल करने के लिए, इसे ईमेल में पैक करने के लिए कोड का पालन करें।

try {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace")));
    while((line = reader.readLine()) != null) {
        trace += line+"\n";
    }
} catch(FileNotFoundException fnfe) {
    // ...
} catch(IOException ioe) {
    // ...
}

Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body = "Mail this to appdeveloper@gmail.com: " + "\n" + trace + "\n";

sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");

ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));

ReaderScopeActivity.this.deleteFile("stack.trace");

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

@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", mode = ReportingInteractionMode.SILENT) 

या आप इसे कंसोल से आज़मा सकते हैं: -

adb logcat -b crash 

लाइन defaultUEH.uncaughtException (t, e) नहीं होगी; विधि को बिना किसी अपवाद के () असीम रूप से कॉल करें?
मिकेल बर्जरॉन नेरॉन

@ मिकेलबर्गरनॉन नं - यह सिर्फ एक ही थ्रोबल को शीर्ष स्तर के हैंडलर में स्थानांतरित करेगा।
प्रारूप 10


36

आप इसे कंसोल से आज़मा सकते हैं:

adb logcat --buffer=crash 

इस विकल्प पर अधिक जानकारी:

adb logcat --help

...

  -b <buffer>, --buffer=<buffer>         Request alternate ring buffer, 'main',
                  'system', 'radio', 'events', 'crash', 'default' or 'all'.
                  Multiple -b parameters or comma separated list of buffers are
                  allowed. Buffers interleaved. Default -b main,system,crash.

9

यदि आप ग्रहण का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप डिबग का उपयोग करते हैं और नहीं चलाते हैं। सुनिश्चित करें कि आप डिबग परिप्रेक्ष्य में हैं (शीर्ष दाएं) आपको लॉग को प्रिंट करने के लिए कुछ समय के लिए 'पुनरारंभ' (F8) को हिट करना पड़ सकता है। क्रैश लॉग नीचे लॉगकॉट विंडो में होगा- फ़ुलस्क्रीन के लिए डबल क्लिक करें और सुनिश्चित करें कि आप नीचे स्क्रॉल करें। आपको त्रुटियों के लिए लाल पाठ दिखाई देगा, क्रैश ट्रेस कुछ इस तरह होगा

09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception
09-04 21:35:15.397: ERROR/AndroidRuntime(778): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.android.helloworld/com.dazlious.android.helloworld.main}: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.os.Looper.loop(Looper.java:123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.main(ActivityThread.java:3948)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at java.lang.reflect.Method.invokeNative(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at java.lang.reflect.Method.invoke(Method.java:521)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at dalvik.system.NativeStart.main(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.example.android.helloworld.main.onCreate(main.java:13)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     ... 11 more

इसके लिए महत्वपूर्ण भाग हैं

09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778):     at com.example.android.helloworld.main.onCreate(main.java:13)

वे बताते हैं कि यह ऑन लाइन विधि में main.java की लाइन 13 पर सीमा अपवाद से एक सरणी था।


9

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

डिस्क्लेमर: मैं Polidea का CTO हूं, Apphance के पीछे एक कंपनी है और इसके सह-निर्माता हैं।

अद्यतन: Apphance अब बंद बीटा नहीं है! अद्यतन 2: Apphance http://applause.com पेशकश के भाग के रूप में उपलब्ध है


2
मैंने सिर्फ कोशिश की और इसे पसंद किया। डॉक्स एक महत्वपूर्ण बिंदु से चूक गया जब आपके ऐप में एफ़ेंसियस लिब को एकीकृत करता है; ग्रहण ADT के नवीनतम संस्करण के साथ, आपको libsनिर्देशिका में apphance.jar को रखना होगा क्योंकि यह SO उत्तर बताता है। यह जीथब कमिटमेंट उन बदलावों को दिखाता है, जिन्हें मुझे अपने वर्ल्डपैप ऐप में उपयोग करने के लिए आवश्यक थे।
जॉनीलैम्बडा

@HohnnyLambada आपकी टिप्पणी के लिए धन्यवाद। हमने इसे स्पष्ट करने के लिए दस्तावेज़ को अपडेट किया है।
पायोत्र डूडा

12
इसे इतने सारे तीर नहीं मिलने चाहिए, जिसमें अधिकांश विकास बजट ($ 2,500 प्रति माह!) की तुलना में 10x अधिक है
user26676

इस टिप्पणी की तारीख में apphance 404 है।
डेव

सही बात। यह पहले से ही लंबे समय से पहले से ही बुरा है जो तब तालियों के साथ अपनी पूरी पेशकश (एफ़हन्स की सुविधा सहित) को पुनः प्रस्तुत करता है। तो अब यह तालियाँ है
।.com

8

यहाँ क्रैश लॉग के लिए एक और समाधान है।

Android बाजार में "क्रैश कलेक्टर" नाम का टूल है

अधिक जानकारी के लिए निम्न लिंक की जाँच करें

http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html


3
एंड्रॉइड 4.1 और बाद में काम नहीं करता है (लॉग पढ़ने के लिए नई अनुमतियां)।
बिल्ली

4

आप से ACRA उपयोग कर सकते हैं इस । इस लाइब्रेरी को अपनी परियोजनाओं में शामिल करना और इसे कॉन्फ़िगर करना, आप उनकी क्रैश रिपोर्ट में प्राप्त कर सकते हैं (अपने ईमेल या gdocs में)। मेरी खराब इंग्लिश के लिए माफ़ कीजिये।


4

यदि आप एक मूल क्रैश रिपोर्टिंग टूल की तलाश कर रहे हैं, तो क्रैश- ट्रेटिक्स का प्रयास करें

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

सौभाग्य!



2

मैंने आपकी सभी समस्याओं को हल करने के लिए यह लाइब्रेरी बनाई है। क्रैश रिपोर्टर आपके सभी क्रैश को कैप्चर करने और उन्हें स्थानीय रूप से डिवाइस में लॉग करने का एक आसान उपकरण है

बस इस निर्भरता को जोड़ें और आप जाने के लिए अच्छे हैं।

compile 'com.balsikandar.android:crashreporter:1.0.1'

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

CrashRepoter.logException(Exception e)

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

Thread.UncaughtExceptionHandler इंटरफ़ेस का उपयोग सभी अनहेल्दी क्रैश को पकड़ने के लिए किया जाता है। यहाँ समान github.com/MindorksOpenSource/CrashReporter/blob/master/… के लिए कार्यान्वयन है ।
बाली

ठीक है, नीबू यह जाँच ...! धन्यवाद
क्लेनोलेशन

2

यहां एक समाधान है जो आपको पाठ फ़ाइल पर सभी लॉग को डंप करने में मदद कर सकता है

adb logcat -d > logs.txt


0

यदि आप बस अपने फोन से कंप्यूटर से कनेक्ट होने के दौरान क्रैश लॉग की तलाश कर रहे हैं, तो ग्रहण में DDMS दृश्य का उपयोग करें और डीडीएमएस के भीतर लॉगकैट में रिपोर्ट सही है जब आपका ऐप डीबग करते समय क्रैश हो जाता है।


0

1) USB के माध्यम से फोन में प्लग (w / डेवलपर डिबगिंग विकल्प सक्षम)

2) अपने Android SDK के लिए टर्मिनल खोलें और नेविगेट करें (Mac के लिए):

cd ~/Library/Android/sdk/platform-tools

3) लॉग (मैक के लिए) की एक निरंतर प्रवाह उत्पन्न करने के लिए उस निर्देशिका (अपने टर्मिनल में) से लॉगकाट:

./adb logcat

4) क्रैश लॉग जेनरेट करने के लिए अपना ऐप खोलें

5) Ctrl + C टर्मिनल को बंद करने और क्रैश होने वाले ऐप से जुड़े लॉग को देखने के लिए। यह निम्नलिखित जैसा कुछ कह सकता है:

AndroidRuntime: FATAL EXCEPTION: main


0

इस POST के आधार पर , "TopExceptionHandler" के प्रतिस्थापन के रूप में इस वर्ग का उपयोग करें

class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
private String line;

public TopExceptionHandler(Activity app) {
    this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    this.app = app;
}

public void uncaughtException(Thread t, Throwable e) {




    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";

    // If the exception was thrown in a background thread inside
    // AsyncTask, then the actual exception can be found with getCause

    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";

    try {
        FileOutputStream trace = app.openFileOutput("stack.trace",
                Context.MODE_PRIVATE);
        trace.write(report.getBytes());
        trace.close();



        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"kevineyni@gmail.com"});
        i.putExtra(Intent.EXTRA_SUBJECT, "crash report azar");
        String body = "Mail this to kevineyni@gmail.com: " + "\n" + trace + "\n";
        i.putExtra(Intent.EXTRA_TEXT   , body);
        try {
            startActivity(Intent.createChooser(i, "Send mail..."));
        } catch (android.content.ActivityNotFoundException ex) {
           // Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
        }






      //  ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));

        //ReaderScopeActivity.this.deleteFile("stack.trace");

    } catch(IOException ioe) {
        // ...
    }

    defaultUEH.uncaughtException(t, e);
}

private void startActivity(Intent chooser) {
}

}

.....

उसी जावा क्लास फ़ाइल (गतिविधि) में .....

Public class MainActivity.....

.....

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));

.....


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