2010-09-04 13 views
118

Tengo una aplicación que no está en el mercado (firmada con un certificado de depuración), pero me gustaría obtener datos de registro de fallos, cada vez que falla mi aplicación. ¿Dónde puedo encontrar un registro de por qué mi aplicación se bloqueó?¿Cómo obtener los registros de bloqueo de Android?

+0

[biblioteca de Android para capturar y reportar los accidentes] (https://github.com/ajitsing/Sherlock) –

Respuesta

116

Si su aplicación está siendo descargada por otras personas y se bloquea en dispositivos remotos, es posible que desee buscar en una biblioteca de informes de errores de Android (referenciada en this SO post). Si solo está en su dispositivo local, puede usar LogCat. Incluso si el dispositivo no estaba conectado a un equipo host cuando se produjo el bloqueo, conectar el dispositivo y emitir un comando adb logcat descargará todo el historial de logcat (al menos en la medida que está almacenado en el búfer, lo que generalmente es una gran cantidad de datos de registro, simplemente no es infinito). ¿Alguna de esas opciones responde tu pregunta? Si no, ¿puedes intentar aclarar un poco más lo que estás buscando?

+2

¿Puede detallar cómo usar el comando adb logcat? ¿Lo ejecuto dentro del directorio/SDK/tools?¿Hay alguna bandera que deba tener en cuenta? etc. –

+2

@ jesses.co.tt Sí, simplemente ejecute 'adb logcat' desde cualquier directorio en el que se encuentre adb. Alternativamente puede usar las herramientas de SDK incluidas en el plugin de Eclipse –

+0

Ok, muchas gracias. –

7

Si está utilizando Eclipse, asegúrese de utilizar depuración y no ejecutar. Asegúrese de estar en la perspectiva de depuración (arriba a la derecha) Puede que tenga que presionar 'Reanudar' (F8) varias veces para que se imprima el registro. El registro de bloqueo estará en la ventana Logcat en la parte inferior; haga doble clic para pantalla completa y asegúrese de desplazarse hasta la parte inferior. Usted verá el texto en rojo para los errores, la traza de choque será algo así como

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 

Las partes importantes de éste son

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) 

los que nos dicen que era un arreglo fuera de los límites de excepción en línea 13 de main.java en el método onCrate.

+0

+1 ok esto fue muy tonto de mi parte ... – UncleZeiv

12

Puede usar Apphance. Este es un servicio multiplataforma (ahora principalmente Android, iOS con otras plataformas en camino) que permite depurar remotamente cualquier dispositivo móvil (Android, iOS ahora, otros en desarrollo). Es mucho más que solo un registro de fallas, de hecho es mucho más: registro, informe de problemas por probadores, registros de fallas. Tarda unos 5 minutos en integrarse. Actualmente puede solicitar el acceso a la versión beta cerrada.

Descargo de responsabilidad: Soy CTO de Polidea, una compañía detrás de Apphance y cocreadora de la misma.

Actualización: ¡Apphance ya no es una versión beta cerrada! Actualización 2: Apphance está disponible como parte de http://applause.com ofreciendo

+2

Acabo de probar la aplicación y me gusta. Los documentos omitieron un punto clave al integrar la aplicación de acceso a la aplicación; con la última versión de Eclipse ADT, debe poner apphance.jar en el directorio 'libs' como [this] (http://stackoverflow.com/a/9916751/9648). Así explica la respuesta. [Este commit de github] (https://github.com/johnnylambada/WorldMap/commit/235ac0461a91a080cca2cdcb7fd2059464165406) ​​muestra los cambios que necesitaba realizar en mi aplicación WorldMap para usar la aplicación. – JohnnyLambada

+0

@HohnnyLambada Gracias por su comentario. Hemos actualizado la documentación para aclarar esto. –

+12

esto no debería tener tantas flechas ascendentes que cuesta 10 veces más que la mayoría de los presupuestos de desarrollo (¡$ 2,500 al mes!) – user26676

4

Puede utilizar ACRA de this. Incluyendo esta biblioteca a sus proyectos y configurándola, podría recibir (en su correo electrónico o gdocs) sus informes de fallos. Perdón por mi mal ingles.

0

Si solo está buscando el registro de bloqueo mientras su teléfono está conectado a la computadora, use la vista DDMS en Eclipse y el informe está justo allí en LogCat dentro de DDMS cuando su aplicación se cuelga durante la depuración.

3

Uso Acra reportero de accidente para Android ..Acra lib

37

La manera de hacer esto es para implementar la interfaz Thread.UncaughtExceptionHandler y pasarlo a Thread.setDefaultUncaughtExceptionHandler() al inicio de su actividad de onCreate(). Aquí está la clase de implementación 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); 
    } 
} 

Nota Dejamos que el entorno operativo de Android funcione con él.

En la parte superior de su actividad para registrar una instancia de clase por encima de la siguiente manera:

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this)); 
... 

Este controlador guarda la traza en un archivo. Cuando ReaderScope se reinicia la próxima vez, detecta el archivo y le indica al usuario si desea enviarlo por correo electrónico al desarrollador.

Para enviar por correo electrónico el Stack Trace, ejecute el siguiente código para empacarlo en un correo electrónico.

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

O también se puede utilizar ACRA Informe de errores System.Just calcular el ACRA.jar en sus bibliotecas de proyectos y utilizar el siguiente fragmento de código antes de que su declaración de la clase de actividad lanzador

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

¿No será la línea defaultUEH.uncaughtException (t, e); llamar al método uncaughtException() infinitamente? –

4

Si una Estamos buscando una herramienta básica de informe de fallas, intente crashlytics.

Si quiere una herramienta de informes más avanzada, Checkout Gryphonet. Registra todos los bloqueos ocurridos junto con la línea exacta de código que causó el bloqueo junto con marcadores automáticos que muestran los pasos que dio el usuario antes del bloqueo y más.

¡Buena suerte!

-1

Prueba la aplicación de registro Carsh de android.

utiliza la aplicación link para descargar.

0

He creado esta biblioteca para resolver todos sus problemas. Crash Reporter is a handy tool to capture all your crashes and log them in device locally

Solo agregue esta dependencia y listo.

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

Encuentra todos tus bloqueos en el dispositivo localmente y arréglesalo a tu conveniencia. Los bloqueos se guardan usando un formato de fecha y hora fácil de seguir. Además, también proporciona API para capturar excepciones registradas usando el método a continuación.

CrashRepoter.logException(Exception e) 
+0

¿Cuál es la clase de Java que utilizó para obtener los registros de bloqueo de un dispositivo? – Xenolion

1

Usted puede intentar esto desde consola: -

Logcat ADB accidente -b

Cuestiones relacionadas