Как получить журналы сбоев Android?

155

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

Шихан Алам
источник

Ответы:

139

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

Крис Томпсон
источник
2
Можете ли вы подробно рассказать, как использовать команду adb logcat? Я запускаю это в каталоге / SDK / tools? Есть ли какие-либо флаги, которые я должен отметить? и т. д.
jesses.co.tt
2
@ jesses.co.tt Да, просто запустите adb logcatиз любого каталога, в котором находится adb. В качестве альтернативы вы можете использовать инструменты SDK, включенные в плагин Eclipse
Chris Thompson
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);
    }
}

Примечание. Мы позволяем платформе Android по умолчанию UHE справиться с этим.

В верхней части вашей 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 
TanvirChowdhury
источник
Не будет ли строка defaultUEH.uncaughtException (t, e); вызывать метод uncaughtException () бесконечно?
Микаэль Бержерон Нерон
@ MickaelBergeronNéron нет - он просто передаст тот же Throwable обработчику верхнего уровня.
formatBCE
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

Если вы используете 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.

Т. Маркл
источник
9

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

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

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

Ярек Потюк
источник
2
Я просто попробовал apphance и мне понравилось. Документы упустили ключевой момент при интеграции apphance lib в ваше приложение; в последней версии Eclipse ADT вы должны поместить apphance.jar в libsкаталог, как объясняется в этом ответе SO. Этот коммит github показывает изменения, которые мне нужно было внести в мое приложение WorldMap, чтобы использовать apphance.
JohnnyLambada
@HohnnyLambada Спасибо за ваш комментарий. Мы обновили документацию, чтобы сделать это более понятным.
Петр Дуда
12
это не должно получить столько стрелок вверх, это будет стоить в 10 раз больше, чем большинство бюджетов на разработку (2500 долларов в месяц!)
user26676
apphance 404 на дату этого комментария.
DaveP
Верный. UTest уже давно обанкротился, а затем переименовал все свое предложение (включая функцию Aphhance) в Applause. Так что теперь это applause.com
Ярек Potiuk
8

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

В Android Market появился инструмент под названием «Crash Collector»

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

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

Кетан Пармар
источник
3
Не работает на Android 4.1 и новее (новые разрешения на чтение логов).
кот
4

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

Хесус Мансано
источник
4

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

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

Удачи!

Ариэль Белл
источник
3

Используйте Acra аварийный репортер для Android-приложения. Acra lib

Мукеш Й
источник
2

Я создал эту библиотеку, чтобы решить все ваши проблемы. Crash Reporter - это удобный инструмент, чтобы фиксировать все ваши сбои и регистрировать их на устройстве локально

Просто добавьте эту зависимость, и все готово.

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

Найти все ваши сбои в устройстве локально и исправить их по вашему усмотрению. Аварии сохраняются с использованием формата даты и времени, который легко отслеживать. Кроме того, он также предоставляет API для захвата зарегистрированных исключений, используя метод ниже.

CrashRepoter.logException(Exception e)
Бали
источник
Какой класс Java вы использовали для получения журналов сбоев устройства?
Ксенолион,
Интерфейс Thread.UncaughtExceptionHandler используется для захвата всех необработанных сбоев. Вот реализация того же github.com/MindorksOpenSource/CrashReporter/blob/master/… .
Бали
Хорошо, дай мне проверить это ...! Спасибо
Ксенолион,
2

Вот решение, которое может помочь вам сбросить все журналы в текстовый файл

adb logcat -d > logs.txt
JGPhilip
источник
0

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

Джонатан Лин
источник
0

1) Подключите телефон через USB (с включенными опциями отладки разработчика)

2) Откройте терминал и перейдите к своему Android SDK (для Mac):

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

3) Logcat из этого каталога (в вашем терминале) для создания постоянного потока журналов (для Mac):

./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) {
}

}

.....

в том же файле класса Java (активность) .....

Public class MainActivity.....

.....

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

.....

Эйни Каве
источник
-1

Попробуйте приложение Carsh log от Android.

используйте ссылку для загрузки приложения.

Прашант Тхакре
источник