From 7e6ce1a3c52d8533fed92c143419fedb0c93988a Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Mon, 10 Jun 2013 17:01:41 -0700 Subject: [PATCH] Fix abort(3) to raise SIGABRT rather than causing SIGSEGV. tgkill() needs the .save stack unwinding directive to get the complete stack trace. BUG: https://code.google.com/p/android/issues/detail?id=16672 Change-Id: Ifb447dca2147a592c48baf32769dfc175d8aea72 --- libc/arch-arm/bionic/tgkill.S | 1 + libc/unistd/abort.c | 18 +++--------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/libc/arch-arm/bionic/tgkill.S b/libc/arch-arm/bionic/tgkill.S index f46cb5870..5f11b2096 100644 --- a/libc/arch-arm/bionic/tgkill.S +++ b/libc/arch-arm/bionic/tgkill.S @@ -39,6 +39,7 @@ */ ENTRY(tgkill) + .save {r4-r7, ip, lr} stmfd sp!, {r4-r7, ip, lr} ldr r7, =__NR_tgkill swi #0 diff --git a/libc/unistd/abort.c b/libc/unistd/abort.c index 4dffbae81..4a349bdd3 100644 --- a/libc/unistd/abort.c +++ b/libc/unistd/abort.c @@ -53,9 +53,7 @@ abort(void) * any errors -- X311J doesn't allow abort to return anyway. */ sigdelset(&mask, SIGABRT); - /* temporary, so deliberate seg fault can be caught by debuggerd */ - sigdelset(&mask, SIGSEGV); - /* -- */ + (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); /* @@ -72,17 +70,7 @@ abort(void) } } - /* temporary, for bug hunting */ - /* seg fault seems to produce better debuggerd results than SIGABRT */ -#ifdef __mips__ - /* An access that will generate SIGSEGV rather than SIGBUS. */ - *((char*)0xdeadc0c0) = 39; -#else - *((char*)0xdeadbaad) = 39; -#endif - /* -- */ - - (void)kill(getpid(), SIGABRT); + raise(SIGABRT); /* * if SIGABRT ignored, or caught and the handler returns, do @@ -99,6 +87,6 @@ abort(void) } (void)sigprocmask(SIG_SETMASK, &mask, (sigset_t *)NULL); - (void)kill(getpid(), SIGABRT); + raise(SIGABRT); _exit(1); }