How to get Android crash logs?

前端 未结 17 1258
余生分开走
余生分开走 2020-11-28 18:07

I have an app that is not in the market place (signed with a debug certificate), but would like to get crash log data, whenever my application crashes. Where can I find a lo

相关标签:
17条回答
  • 2020-11-28 18:30

    You can try this from the console:

    adb logcat --buffer=crash 
    

    More info on this option:

    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.
    
    0 讨论(0)
  • 2020-11-28 18:30

    1) Plug in Phone through USB (w/ Developer Debugging options enabled)

    2) Open Terminal and Navigate to your Android SDK (for Mac):

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

    3) Logcat from that directory (in your terminal) to generate a constant flow of logs (for Mac):

    ./adb logcat

    4) Open your app that crashes to generate crash logs

    5) Ctrl+C to stop terminal and look for the logs associated with the app that crashes. It may say something like the following:

    AndroidRuntime: FATAL EXCEPTION: main

    0 讨论(0)
  • 2020-11-28 18:31

    I have created this library to solve all your problems. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

    Just add this dependency and you're good to go.

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

    Find all your crashes in device locally and fix them at your convenience. Crashes are saved using date and time format easy to track. Plus it also provides API for capture Logged Exceptions using below method.

    CrashRepoter.logException(Exception e)
    
    0 讨论(0)
  • 2020-11-28 18:32

    The way to do this is to implement the Thread.UncaughtExceptionHandler interface and pass it to Thread.setDefaultUncaughtExceptionHandler() at the beginning of your Activity's onCreate(). Here is the implementation class 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);
        }
    }
    

    Note We let the Android framework's defaultUEH to handle it.

    At the top of your Activity register an instance of above class like this:

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

    This handler saves the trace in a file. When ReaderScope restarts next time, it detects the file and prompts the user if he/she wants to email it to the developer.

    To Email the Stack Trace, execute following code to pack it in an email.

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

    Or you can also use ACRA Error Reporting System.Just Include the ACRA.jar in your project libs and use the below code snippet before your launcher activity class declaration

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

    or You can try this from console:-

    adb logcat -b crash 
    
    0 讨论(0)
  • 2020-11-28 18:33

    You can use Apphance. This is a cross-platform service (now mainly Android, iOS with other platforms on their way) which allows to debug remotely any mobile device (Android, iOS now - others under development). It's much more than just a crashlog, in fact it is much more: logging, reporting of problems by testers, crashlogs. It takes about 5 minutes to integrate. Currently you can request for access to closed beta.

    Disclaimer: I am CTO of Polidea, a company behind Apphance and co-creator of it.

    Update: Apphance is no longer closed beta! Update 2: Apphance is available as part of http://applause.com offering

    0 讨论(0)
  • 2020-11-28 18:37

    If your app is being downloaded by other people and crashing on remote devices, you may want to look into an Android error reporting library (referenced in this SO post). If it's just on your own local device, you can use LogCat. Even if the device wasn't connected to a host machine when the crash occurred, connecting the device and issuing an adb logcat command will download the entire logcat history (at least to the extent that it is buffered which is usually a loooot of log data, it's just not infinite). Do either of those options answer your question? If not can you attempt to clarify what you're looking for a bit more?

    0 讨论(0)
提交回复
热议问题