Debe comenzar atrapando el SIGSEGV para ejecutar el código cuando obtiene un segv. Este es el código POSIX, así que algo similar debería trabajar en android:
void abortHandler(int signum, siginfo_t* si, void* unused)
{
const char* name = NULL;
switch(signum)
{
case SIGABRT: name = "SIGABRT"; break;
case SIGSEGV: name = "SIGSEGV"; break;
case SIGBUS: name = "SIGBUS"; break;
case SIGILL: name = "SIGILL"; break;
case SIGFPE: name = "SIGFPE"; break;
case SIGPIPE: name = "SIGPIPE"; break;
}
if (name)
printf(stderr, "Caught signal %d (%s)\n", signum, name);
else
printf(stderr, "Caught signal %d\n", signum);
printStackTrace(stderr);
exit(signum);
}
void handleCrashes()
{
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = abortHandler;
sigemptyset(&sa.sa_mask);
sigaction(SIGABRT, &sa, NULL);
sigaction(SIGSEGV, &sa, NULL);
sigaction(SIGBUS, &sa, NULL);
sigaction(SIGILL, &sa, NULL);
sigaction(SIGFPE, &sa, NULL);
sigaction(SIGPIPE, &sa, NULL);
}
El siguiente paso es llamar a esa función para registrar los manejadores de señales. Puedes hacerlo como lo primero en main, pero luego no obtendrás rastros de pila hasta main. Si los quiere antes, puede llamar a esta función desde el constructor de un objeto global. Pero no hay garantía de que será el primer constructor llamado. Hay formas de asegurarse de que se llame temprano. Por ejemplo, operador de sobrecarga nuevo - en compilaciones de depuración - para inicializar primero los rastreos de pila en la primera asignación, y luego llamar al operador real nuevo. Esto le dará rastros de pila comenzando en la primera asignación.
Para imprimir un seguimiento de pila:
void printStackTrace(unsigned int max_frames = 63)
{
void* addrlist[max_frames+1];
// retrieve current stack addresses
u32 addrlen = backtrace(addrlist, sizeof(addrlist)/sizeof(void*));
if (addrlen == 0)
{
printf(stderr, " <empty, possibly corrupt>\n");
return;
}
char** symbollist = backtrace_symbols(addrlist, addrlen);
for (u32 i = 3; i < addrlen; i++)
printf(stderr, "%s\n", symbollist[i]):
}
Usted tendrá que trabajar más para demangle los símbolos para que puedan leerlo. prueba abi :: __ cxa_demangle. Por supuesto, compila con -g y enlaza con -dinámica.
marque esta respuesta. esto es específicamente para Android http://stackoverflow.com/a/28858941/365229 –