2010-09-04 2 views
118

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

+0

[Android библиотека, чтобы захватить и сообщить аварии] (https://github.com/ajitsing/Sherlock) –

ответ

116

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

+2

можете ли вы описать, как использовать команду adb logcat?Я запускаю его внутри каталога/SDK/tools? Есть ли какие-то флаги, которые я должен отметить? и т. д. –

+2

@ jesses.co.tt Да, просто запустите 'adb logcat' из любого каталога, в котором находится adb. В качестве альтернативы вы можете использовать инструменты SDK, включенные в плагин Eclipse. –

+0

Хорошо, спасибо большое. –

7

Если вы используете Eclipse, убедитесь, что вы используете debug и не запускаете. Убедитесь, что вы находитесь в точке отладки (вверху справа). Возможно, вам понадобится несколько раз нажать «Возобновить» (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.

+0

+1 ОК, это было очень глупо от меня ... – UncleZeiv

12

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

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

Обновление: Apphance больше не закрывается бета-версия! Обновление 2: Аппанс доступен в составе http://applause.com, предлагающий

+2

Я просто попробовал apphance и мне понравилось. Документы пропустили ключевой момент при интеграции apphance lib в ваше приложение; с последней версией Eclipse ADT, вы должны поместить apphance.jar в каталог 'libs' как [this] (http://stackoverflow.com/a/9916751/9648). Ответ SO объясняет. [Этот github commit] (https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406) ​​показывает изменения, которые мне нужно внести в мое приложение WorldMap, чтобы использовать apphance. – JohnnyLambada

+0

@HohnnyLambada Спасибо за ваш комментарий. Мы обновили документацию, чтобы сделать это более понятным. –

+12

это не должно быть так много стрелок, оно стоит в 10 раз больше, чем большинство бюджетов развития (2500 долларов в месяц!) – user26676

7

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

Android рынок имеет инструмент под названием "Crash Коллектор"

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

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

+3

Не работает на Android 4.1 и более поздних версиях (новые разрешения на чтение журналов). – cat

4

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

0

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

3

Использование АКрА аварии репортер андроид приложения ..Acra lib

37

Способ сделать это, чтобы реализовать интерфейс 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 по умолчанию использовать ее.

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

@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 [email protected]: " + "\n" + trace + "\n"; 

sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
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 Error Reporting System.Just Включите ACRA.jar в ваших LIBS проекта и использовать ниже фрагмент кода перед вашей пусковой декларации класса активности

@ReportsCrashes(formKey = "", mailTo = "[email protected];[email protected]", mode = ReportingInteractionMode.SILENT) 
+0

Не будет ли строка defaultUEH.uncaughtException (t, e); вызов метода uncaughtException() бесконечно? –

4

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

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

Удачи вам!

-1

Попробуйте приложение для регистрации на компьютере с Android.

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

0

Я создал эту библиотеку, чтобы решить все ваши проблемы. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

Просто добавьте эту зависимость, и вы хорошо пойдете.

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

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

CrashRepoter.logException(Exception e) 
+0

Что такое класс Java, который использовался для получения журналов сбоев на устройстве? – Xenolion

+0

Интерфейс Thread.UncaughtExceptionHandler используется для захвата всех необработанных сбоев. Вот реализация для того же https://github.com/MindorksOpenSource/CrashReporter/blob/master/crashreporter/src/main/java/com/balsikandar/crashreporter/utils/CrashReporterExceptionHandler.java. – Bali

+0

Ладно, посмотри это ...! благодаря – Xenolion

1

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

ADB LogCat -b аварии

Смежные вопросы