Sie müssen beginnen, indem Sie die SIGSEGV abfangen, um Code auszuführen, wenn Sie ein Segment erhalten. Dies ist Posix-Code, so etwas Ähnliches sollte auf Android funktionieren:
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);
}
Die nächste Sache ist, dass die Funktion aufrufen, um die Signal-Handler zu registrieren. Du kannst es als erstes in main machen, aber dann bekommst du keine Stack-Spuren bis main. Wenn Sie sie zuvor möchten, können Sie diese Funktion vom Konstruktor eines globalen Objekts aufrufen. Aber es gibt keine Garantie, dass es der erste aufgerufene Konstruktor sein wird. Es gibt Möglichkeiten, um sicherzustellen, dass es früh aufgerufen wird. Zum Beispiel, Überladungs-Operator neu - in Debug-Builds - zuerst die Stack-Traces bei der ersten Zuweisung zu initialisieren und dann in den realen Operator neu aufzurufen. Dies gibt Ihnen Stack-Spuren, die bei der ersten Zuweisung beginnen.
einen Stack-Trace drucken:
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]):
}
Sie müssen mehr Arbeit tun, um die Symbole demangle sie lesbar zu machen. versuchen Sie abi :: __ cxa_demangle. Natürlich baue mit -g auf und verlinke mit -rdynamic.
überprüfen Sie diese Antwort. das ist speziell für android http://stackoverflow.com/a/28858941/365229 –