2011-09-17 12 views
9

Tengo una aplicación que es en su mayoría código nativo escrito en C: Simon Tatham's Puzzles. Cuando cojo un accidente (con un controlador de señal), la traza de Java sólo me dirá el área vaga del problema:Cómo recopilar stacktrace nativo sin un miedo READ_LOGS permiso por adelantado?

W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles.resizeEvent(Native Method) 
W System.err: at name.boyle.chris.sgtpuzzles.SGTPuzzles$1.handleMessage(SGTPuzzles.java:126) 
W System.err: at android.os.Handler.dispatchMessage(Handler.java:99) 

Lo que necesito para poder tener alguna esperanza de diagnóstico es la traza nativa que el marco Android escribe en el registro: rastros

I DEBUG :   #02 pc 0003e8ae /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so 
I DEBUG :   #03 pc 0003ed62 /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so 
I DEBUG :   #04 pc 00059060 /data/data/name.boyle.chris.sgtpuzzles/lib/libpuzzles.so 

Por lo que yo sé, los informes de fallos de Android Market no incluyen nativos ... ¿verdad?

Por lo tanto, actualmente tengo mi propio receptor de fallos y reportero, descrito en this previous question, que ofrecerá que te deje caer en una ventana de redacción de correo electrónico con tu inicio de sesión. Eso funciona bastante bien, con un problema: los usuarios no leen (o no creen) la explicación en la descripción del paquete y se espantan ante la solicitud de permiso.

Permission request to read logs; comments about it from users

No es estos pocos comentarios que me molestan, es el número desconocido de personas que huyen sin siquiera instalarlo. ? :-(

Así ¿cómo puedo conseguir una traza nativo en accidente sin hacer juego exigen un permiso troncos de aspecto aterrador soluciones posibles incluyen:

  • estoy equivocado y Android Market en realidad dame nativo huellas en estos días?
  • Recomiendo cuando atrapo un choque que las personas instalan inmediatamente y ejecutan Log Collector? Esto es lo que me estoy inclinando actualmente. Alguien tiene un buen ejemplo de esto hecho, con bien escrito texto explicativo?
  • Habiendo atrapado el bloqueo con un manejador de señal (lo que puedo hacer), ¿hay alguna manera de leer mi stacktrace nativo? Más difícil en Android/Bionic que en plataformas glibc, no hay disponible backtrace(). Editar: La mayoría de las cosas aquí parecen ser necesarias: http://github.com/android/platform_system_core/tree/master/debuggerd - incluir suficiente cantidad en el proyecto sería excesivo, abrumador, difícil, sin soporte, frágil en los cambios/adiciones de ABI. No parece un buen uso del tiempo.
+0

En Java, tenemos Thread.setDefaultUncaughtExceptionHandler(), que es cómo cosas como ACRA obtienen rastros de pila. ¿No hay un equivalente en el entorno C/C++, por lo que puede detectar estas excepciones antes de que dejen su código? Su objetivo debe ser recopilar la información de seguimiento de la pila antes de que llegue al registro. Una vez que esté en el registro, necesitará el permiso, ya que el registro es más que solo su resultado. – CommonsWare

+0

@CommonsWare Sí, ya configuré un controlador de señal en C. Mi dificultad, como digo en el último punto, es cómo obtener la pila una vez que atrapé un choque. La plataforma puede hacerlo, para colocarlo en los registros, pero no hay una API compatible para ello. –

+0

Si encuentra el código para recopilar la traza inversa, copie el código en su proyecto y use su propia implementación. – CommonsWare

Respuesta

6

Editar: De Jelly Bean en adelante, ni usted ni Recopilador de registro puede leer la salida debuggerd 's, porque READ_LOGS went away. :-(

Pero, Jugar informes de fallos de la consola incluyen ahora seguimientos de pila nativos (por lo menos a partir de finales de 2014), lo que hace que esto sea mucho menos necesario

Anteriormente:.

daré mi respuesta en forma de un git commit:

https://github.com/chrisboyle/sgtpuzzles/commit/e9917f1ffe93f9d9963463db849e3768beafccee

Esta es la delegación en Log Collector, como he indicado en el anterior.Capturo el bloqueo como antes (vea my previous discussion of how to do that) muestro una pantalla de "¡Vaya! Me colapsé" como antes, y si el usuario hace clic en Informar, entonces les pido que instalen el Recolector de Registros si aún no lo han hecho.

Si he enviado al usuario para instalarlo, tan pronto como termine de instalar, detecto el intento PACKAGE_ADDED y ejecuto Log Collector con las opciones adecuadas (advierto que voy a hacer esto). Esto es para que el usuario no se quede adivinando que debe hacer clic en Abrir, lo que lo lanzaría sin mi destino, sujeto y filtros.

Vale la pena tener los filtros, ya que limitan lo que se envía en el correo electrónico a las líneas que podrían ser relevantes. Esto ahorra el ancho de banda del usuario y la capacidad de mi bandeja de entrada, y significa que el usuario puede verificar más fácilmente que no hay nada sensible en el registro y, por lo tanto, es más probable que acepte enviarlo.

0

Hay otra forma de acceder a todos los registros sin ningún permiso especial, pero requiere habilitar la depuración remota en el teléfono. Eche un vistazo a la fuente abierta rootless Logcat app.

Cuestiones relacionadas