Как получить журналы сбоев Android? - PullRequest
141 голосов
/ 04 сентября 2010

У меня есть приложение, которого нет в продаже (подписано с помощью сертификата отладки), но я хотел бы получать данные журнала сбоев всякий раз, когда происходит сбой моего приложения.Где я могу найти журнал, по которому мое приложение упало?

Ответы [ 15 ]

134 голосов
/ 04 сентября 2010

Если ваше приложение загружается другими людьми и происходит сбой на удаленных устройствах, вы можете заглянуть в библиотеку отчетов об ошибках Android (ссылка на которую приведена в этой публикации SO ). Если это только на вашем локальном устройстве, вы можете использовать LogCat. Даже если устройство не было подключено к хост-машине, когда произошел сбой, подключение устройства и ввод команды adb logcat загрузит всю историю logcat (по адресу по крайней мере, в той степени, в которой он буферизуется, что обычно представляет собой петлю журнальных данных, это просто не бесконечно). Ответят ли какие-либо из этих вариантов на ваш вопрос? Если нет, можете ли вы попытаться уточнить, что вы ищете немного больше?

43 голосов
/ 20 марта 2014

Способ сделать это - реализовать интерфейс 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);
    }
}

Примечание. Мы разрешим стандартному UH фреймворка Android обработать его.

В верхней части вашей Activity зарегистрируйте экземпляр вышеупомянутого класса, например так:

@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 
32 голосов
/ 03 сентября 2015

Это от http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html

Вы можете использовать ADB:

adb logcat AndroidRuntime:E *:S
25 голосов
/ 25 октября 2017

Вы можете попробовать это из консоли: -

adb logcat -b crash

10 голосов
/ 29 мая 2011

Вы можете использовать Apphance.Это кроссплатформенный сервис (сейчас это в основном Android, iOS с другими платформами в пути), который позволяет удаленно отлаживать любое мобильное устройство (Android, iOS сейчас - другие в разработке).Это гораздо больше, чем просто краш-журнал, на самом деле это гораздо больше: регистрация, сообщение о проблемах тестировщиками, краш-блоги.Интеграция занимает около 5 минут.В настоящее время вы можете запросить доступ к закрытой бета-версии.

Отказ от ответственности: Я являюсь техническим директором Polidea, компании, возглавляющей Apphance, и ее соавтором.

Обновление: Apphance больше не закрыта бета-версия!Обновление 2: Apphance доступен как часть http://applause.com предложения

8 голосов
/ 18 августа 2011

Вот еще одно решение для Crash Log.

В Android market есть инструмент с именем "Crash Collector"

. Для получения дополнительной информации перейдите по следующей ссылке

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

7 голосов
/ 05 сентября 2010

Если вы используете Eclipse, убедитесь, что вы используете отладку и не запускаетесь.Убедитесь, что вы находитесь в перспективе отладки (вверху справа). Возможно, вам придется несколько раз нажать «Возобновить» (F8), чтобы распечатать журнал.Журнал сбоев будет находиться в окне Logcat внизу - дважды щелкните на полноэкранном режиме и убедитесь, что вы прокрутите вниз.Вы увидите красный текст для ошибок, трассировка сбоя будет выглядеть примерно так:

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)

, которые говорят нам, что это массив изограничивает исключение в строке 13 файла main.java в методе onCrate.

4 голосов
/ 15 октября 2015

Если вы ищете базовый инструмент отчетности о сбоях, попробуйте crashlytics .

Если вам нужен более продвинутый инструмент отчетности, Checkout Gryphonet . Он регистрирует все произошедшие сбои вместе с точной строкой кода, которая вызвала сбой, а также с автоматическими маркерами, показывающими шаги, которые пользователь предпринял до сбоя, и многое другое.

Удачи!

4 голосов
/ 20 декабря 2012

Вы можете использовать ACRA от до . Включив эту библиотеку в свои проекты и настроив ее, вы можете получать (в свою электронную почту или gdocs) их отчеты о сбоях. Извините за мой плохой английский.

3 голосов
/ 10 ноября 2013

Используйте acra crash reporter для приложений Android. Acra lib

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...