Código nativo – cómo obtener la pila de llamadas de función (backtrace) mediante programación

Tengo la base de código de C ++ funcionando en androide, y quiero tener informes de choque enviados por los usuarios.

Estoy usando la biblioteca de ACRA que trabaja muy bien para el código de Java, pero cuando algo se estrella en código nativo, no consigo la suficiente información. En realidad, me gustaría recibir un seguimiento de pila de llamadas de función nativa. Sé que la información del impacto se imprime en logcat después de que termine mi proceso, y puedo configurar ACRA para leer / enviar logcat. He configurado mi código para detectar el fallo nativo usando manejadores de señal y llamando de nuevo a Java para informar por ACRA. Funciona también bien.

Sin embargo, hay mala sincronización con este enfoque – ACRA lee los registros mientras el proceso de bloqueo sigue vivo, y Android (no sé exactamente qué parte) escribe el informe de fallo para logcat después de un accidente proceso termina completamente. Por lo tanto, no recibo los rastros de la pila cuando uso ACRA.

Así que estoy buscando una manera de leer programatically rastro de pila actual de código C ++, y alimentar esta información a ACRA (o tal vez otra herramienta de informes de fallo) yo mismo.

Todo lo que necesito es algún tipo de este 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 la pila de mi código?

He hecho esto en mi proyecto de base de juego – se puede ver el código JNI que maneja esto aquí:

Https: / / bitbit /

Que llama al método Java definido aquí:

Https: / / bitbit /

La solución general se basa en el manejo de señales, luego en el controlador de señal disparando una llamada a java para volcar la pila de seguimiento, etc, en mi código iniciar otra actividad para obtener la información logcat y enviarlo por correo electrónico a mí.

ACRA puede atrapar el bloqueo de la aplicación. A continuación, podría instanciar un segundo proceso que ejecutaría el comando logcat (ver esta pregunta ), filtrando por el nombre de su aplicación y, a continuación, tendrá el proceso para enviar el archivo descargado a usted. Esto está lejos de ser óptimo porque:

  • La aplicación que abarcará logcat debe tener los permisos WRITE_EXTERNAL_STORAGE y READ_LOGS
  • Probablemente el usuario se molestaría al tener que instalar un nuevo programa

Pero no encontré otra alternativa para hacer esto.

  • Cómo conectar una biblioteca C a la aplicación de iOS
  • Ndk-stack no funciona
  • Recuperar android.os.Build ... propiedades del sistema mediante la aplicación puramente nativa de Android
  • Ejecutar código en el subproceso principal / UI en Cocos2dx
  • Definir macro para registrar error con archivo y línea en android
  • Excepción actualizando juego a cocos2d-x v2.0
  • Cómo llamar a función Java desde c
  • Android ICS: intento de error JNI para usar referencia local obsoleta 0x1
  • Android cómo mantener la biblioteca nativa cuando la aplicación se detuvo
  • Android: Calling System.loadLibrary () hace que el proceso muera
  • No se puede acceder a AAssetManager en código nativo pasado de Java en WallpaperService
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.