summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2011-03-10 21:20:35 +0000
committerDmitry V. Levin <ldv@altlinux.org>2011-03-10 22:25:03 +0000
commit6b7a261ff81fdbe84769cb59852fa43cabc77e8f (patch)
tree83d58aff49babba41fee7600194e51cac22b0ea5
parentc15dfc796150d09bb74bebfbb85bebf142766b6c (diff)
downloadstrace-ldv/trace-siginfo.tar.gz
Show more details about signals received by traced processessldv/trace-siginfo
* strace.c [!USE_PROCFS] (trace): Differentiate output format depending on PTRACE_GETSIGINFO success or failure. In the former case, use printsiginfo() to show more details about received signal.
-rw-r--r--strace.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/strace.c b/strace.c
index 42d436e1a..774d172d2 100644
--- a/strace.c
+++ b/strace.c
@@ -2637,25 +2637,34 @@ Process %d attached (waiting for parent)\n",
}
if (cflag != CFLAG_ONLY_STATS
&& (qual_flags[WSTOPSIG(status)] & QUAL_SIGNAL)) {
- unsigned long addr = 0;
- long pc = 0;
siginfo_t si;
#if defined(PT_CR_IPSR) && defined(PT_CR_IIP)
-# define PSR_RI 41
- long psr;
+ long pc = 0;
+ long psr = 0;
upeek(tcp, PT_CR_IPSR, &psr);
upeek(tcp, PT_CR_IIP, &pc);
+# define PSR_RI 41
pc += (psr >> PSR_RI) & 0x3;
+# define PC_FORMAT_STR " @ %lx"
+# define PC_FORMAT_ARG pc
+#else
+# define PC_FORMAT_STR "%s"
+# define PC_FORMAT_ARG ""
#endif
- si.si_addr = NULL;
- if (ptrace(PTRACE_GETSIGINFO, pid, 0, &si) == 0)
- addr = (unsigned long) si.si_addr;
printleader(tcp);
- tprintf("--- %s (%s) @ %lx (%lx) ---",
- signame(WSTOPSIG(status)),
- strsignal(WSTOPSIG(status)), pc, addr);
+ if (ptrace(PTRACE_GETSIGINFO, pid, 0, &si) == 0) {
+ tprintf("--- ");
+ printsiginfo(&si, verbose(tcp));
+ tprintf(" (%s)" PC_FORMAT_STR " ---",
+ strsignal(WSTOPSIG(status)),
+ PC_FORMAT_ARG);
+ } else
+ tprintf("--- %s by %s" PC_FORMAT_STR " ---",
+ strsignal(WSTOPSIG(status)),
+ signame(WSTOPSIG(status)),
+ PC_FORMAT_ARG);
printtrailer();
}
if (((tcp->flags & TCB_ATTACHED) ||