android - título - Código nativo: cómo obtener la función de pila de llamadas(backtrace) mediante programación
pila de computadora funcion (2)
Tengo una base de código de C ++ que se ejecuta en Android y deseo que los usuarios envíen informes de fallos.
Estoy usando la biblioteca ACRA que funciona bien para el código Java, pero cuando algo falla en el código nativo, no obtengo suficiente información. En realidad me gustaría recibir un seguimiento de pila de llamadas a funciones nativas. Sé que la información del fallo se imprime en logcat después de que finalice mi proceso, y puedo configurar ACRA para leer / enviar logcat. He configurado mi código para detectar fallos nativos utilizando controladores de señales y devolviendo llamadas a Java para que ACRA realice informes. Funciona también bien.
Sin embargo, hay un mal momento con este enfoque: ACRA lee los registros mientras el proceso de bloqueo aún está vivo, y Android (no sé exactamente qué parte) escribe el informe de bloqueo en Logcat después de que el proceso se termina por completo. Así que no recibo trazas de pila cuando uso ACRA.
Así que estoy buscando una manera de leer programáticamente el seguimiento actual de la pila desde el código C ++, y alimentar esta información a ACRA (o tal vez a otra herramienta de informes de fallos).
Todo lo que necesito es algún tipo de informe escrito a logcat:
10-10 08:29:13.868: INFO/DEBUG(1121): #00 pc 0003fc7c /data/data/com.ex.lib/libapp.so
10-10 08:29:13.891: INFO/DEBUG(1121): #04 pc 00016df4 /system/lib/libdvm.so
10-10 08:29:13.891: INFO/DEBUG(1121): #05 pc 00045284 /system/lib/libdvm.so
10-10 08:29:13.899: INFO/DEBUG(1121): #15 pc 00047c56 /system/lib/libdvm.so
10-10 08:29:13.922: INFO/DEBUG(1121): #16 pc 00030e4c /system/lib/libandroid_runtime.so
¿Hay alguna manera de obtener este seguimiento de pila de mi código?
ACRA puede atrapar la aplicación fallando. Luego, podría crear una instancia de un segundo proceso que ejecutaría el comando logcat (consulte esta pregunta ), filtrando por el nombre de su aplicación, y luego tener el proceso para enviarle el archivo volcado. Esto está lejos de ser óptimo porque:
- La aplicación que abarque logcat debe tener los permisos WRITE_EXTERNAL_STORAGE y READ_LOGS
- Probablemente el usuario estaría molesto por tener que instalar un nuevo programa.
Pero no encontré otra alternativa para hacer esto.
He hecho esto en mi proyecto de base de juegos; puedes ver el código JNI que maneja esto aquí:
https://bitbucket.org/xg/android-game-base/src/c0d969d44a55/jni/NativeActivityJNI.cpp#cl-40
que llama al método Java definido aquí:
La solución general se basa en el manejo de las señales, luego, en el controlador de señales, se activa una llamada a Java para volcar el seguimiento de la pila, etc. En mi código, comienzo otra actividad para obtener la información de Logcat y me la envían por correo electrónico.