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.
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.
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
@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. –
Si encuentra el código para recopilar la traza inversa, copie el código en su proyecto y use su propia implementación. – CommonsWare