У меня есть приложение, которого нет в продаже (подписано с помощью сертификата отладки), но я хотел бы получать данные журнала сбоев всякий раз, когда происходит сбой моего приложения. Где я могу найти журнал, почему мое приложение упало?
У меня есть приложение, которого нет в продаже (подписано с помощью сертификата отладки), но я хотел бы получать данные журнала сбоев всякий раз, когда происходит сбой моего приложения. Где я могу найти журнал, почему мое приложение упало?
Ответы:
Если ваше приложение загружается другими людьми и происходит сбой на удаленных устройствах, вы можете заглянуть в библиотеку отчетов об ошибках Android (упоминается в этом посте SO ). Если это только на вашем собственном локальном устройстве, вы можете использовать LogCat.
Даже если устройство не было подключено к хост-машине, когда произошел сбой, подключение устройства и выполнение adb logcat
команды загрузит всю историю logcat (по крайней мере, в той степени, в которой это буферизуется, что обычно представляет собой петлю из данных журнала, но это не бесконечно). Любой из этих вариантов ответа на ваш вопрос? Если нет, можете ли вы попытаться уточнить, что вы ищете немного больше?
adb logcat
из любого каталога, в котором находится adb. В качестве альтернативы вы можете использовать инструменты SDK, включенные в плагин Eclipse
$SDK_DIR/platform-tools/
. Чтобы показать ошибку:.\adb.exe logcat -v time *:E
Способ сделать это - реализовать 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
Это из http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html
Вы можете использовать ADB:
adb logcat AndroidRuntime:E *:S
Вы можете попробовать это из консоли:
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.
Если вы используете 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.
Вы можете использовать Apphance. Это кроссплатформенный сервис (сейчас это в основном Android, iOS с другими платформами в пути), который позволяет удаленно отлаживать любое мобильное устройство (Android, iOS сейчас - другие в разработке). Это гораздо больше, чем просто краш-журнал, на самом деле это гораздо больше: регистрация, сообщение о проблемах тестировщиками, краш-блоги. Интеграция занимает около 5 минут. В настоящее время вы можете запросить доступ к закрытой бета-версии.
Отказ от ответственности: я технический директор Polidea, компании, которая стоит за Apphance и является ее соавтором.
Обновление: Apphance больше не закрыта бета-версия! Обновление 2: Apphance доступен как часть предложения http://applause.com
libs
каталог, как объясняется в этом ответе SO. Этот коммит github показывает изменения, которые мне нужно было внести в мое приложение WorldMap, чтобы использовать apphance.
Вот еще одно решение для Crash Log.
В Android Market появился инструмент под названием «Crash Collector»
проверьте следующую ссылку для получения дополнительной информации
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
Вы можете использовать ACRA из этого . Включив эту библиотеку в свои проекты и настроив ее, вы можете получать (в свою электронную почту или gdocs) их отчеты о сбоях. Извините за мой плохой английский.
Если вы ищете базовый инструмент для отчетов о сбоях , попробуйте сбои .
Если вам нужен более продвинутый инструмент отчетности, Checkout Gryphonet . Он регистрирует все произошедшие сбои вместе с точной строкой кода, которая вызвала сбой, а также с автоматическими маркерами, показывающими шаги, которые пользователь предпринял до сбоя, и многое другое.
Удачи!
Я создал эту библиотеку, чтобы решить все ваши проблемы. Crash Reporter - это удобный инструмент, чтобы фиксировать все ваши сбои и регистрировать их на устройстве локально
Просто добавьте эту зависимость, и все готово.
compile 'com.balsikandar.android:crashreporter:1.0.1'
Найти все ваши сбои в устройстве локально и исправить их по вашему усмотрению. Аварии сохраняются с использованием формата даты и времени, который легко отслеживать. Кроме того, он также предоставляет API для захвата зарегистрированных исключений, используя метод ниже.
CrashRepoter.logException(Exception e)
Вы также можете использовать библиотеку crashcatcher
Если вы просто ищете журнал сбоев, когда ваш телефон подключен к компьютеру, используйте представление DDMS в Eclipse, и отчет прямо в LogCat в DDMS, когда ваше приложение дает сбой во время отладки.
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
Основываясь на этом 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));
.....
Попробуйте приложение Carsh log от Android.
используйте ссылку для загрузки приложения.