diff options
author | Carl Shapiro <cshapiro@google.com> | 2010-10-11 10:49:17 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-11 10:49:17 -0700 |
commit | 503818eb662a9376b5d5d3ed06d7d2516db389ec (patch) | |
tree | 418cdcc4d38cb3c5d6fe7082689a0475a487bc45 /debuggerd | |
parent | dff02374301f93860568c7805e20b55e2e04a179 (diff) | |
parent | 5c5ff87ded019537bbaf6383618ef2956aaa0407 (diff) | |
download | system_core-503818eb662a9376b5d5d3ed06d7d2516db389ec.zip system_core-503818eb662a9376b5d5d3ed06d7d2516db389ec.tar.gz system_core-503818eb662a9376b5d5d3ed06d7d2516db389ec.tar.bz2 |
am 5c5ff87d: am 83c6b052: Print out the signal code along with signal number and address.
Merge commit '5c5ff87ded019537bbaf6383618ef2956aaa0407'
* commit '5c5ff87ded019537bbaf6383618ef2956aaa0407':
Print out the signal code along with signal number and address.
Diffstat (limited to 'debuggerd')
-rw-r--r-- | debuggerd/debuggerd.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/debuggerd/debuggerd.c b/debuggerd/debuggerd.c index 39835ac..248bc9a 100644 --- a/debuggerd/debuggerd.c +++ b/debuggerd/debuggerd.c @@ -320,6 +320,50 @@ const char *get_signame(int sig) } } +const char *get_sigcode(int signo, int code) +{ + switch (signo) { + case SIGILL: + switch (code) { + case ILL_ILLOPC: return "ILL_ILLOPC"; + case ILL_ILLOPN: return "ILL_ILLOPN"; + case ILL_ILLADR: return "ILL_ILLADR"; + case ILL_ILLTRP: return "ILL_ILLTRP"; + case ILL_PRVOPC: return "ILL_PRVOPC"; + case ILL_PRVREG: return "ILL_PRVREG"; + case ILL_COPROC: return "ILL_COPROC"; + case ILL_BADSTK: return "ILL_BADSTK"; + } + break; + case SIGBUS: + switch (code) { + case BUS_ADRALN: return "BUS_ADRALN"; + case BUS_ADRERR: return "BUS_ADRERR"; + case BUS_OBJERR: return "BUS_OBJERR"; + } + break; + case SIGFPE: + switch (code) { + case FPE_INTDIV: return "FPE_INTDIV"; + case FPE_INTOVF: return "FPE_INTOVF"; + case FPE_FLTDIV: return "FPE_FLTDIV"; + case FPE_FLTOVF: return "FPE_FLTOVF"; + case FPE_FLTUND: return "FPE_FLTUND"; + case FPE_FLTRES: return "FPE_FLTRES"; + case FPE_FLTINV: return "FPE_FLTINV"; + case FPE_FLTSUB: return "FPE_FLTSUB"; + } + break; + case SIGSEGV: + switch (code) { + case SEGV_MAPERR: return "SEGV_MAPERR"; + case SEGV_ACCERR: return "SEGV_ACCERR"; + } + break; + } + return "?"; +} + void dump_fault_addr(int tfd, int pid, int sig) { siginfo_t si; @@ -328,8 +372,10 @@ void dump_fault_addr(int tfd, int pid, int sig) if(ptrace(PTRACE_GETSIGINFO, pid, 0, &si)){ _LOG(tfd, false, "cannot get siginfo: %s\n", strerror(errno)); } else { - _LOG(tfd, false, "signal %d (%s), fault addr %08x\n", - sig, get_signame(sig), si.si_addr); + _LOG(tfd, false, "signal %d (%s), code %d (%s), fault addr %08x\n", + sig, get_signame(sig), + si.si_code, get_sigcode(sig, si.si_code), + si.si_addr); } } |