On Thu, 2011-03-10 at 00:59 +0300, Dmitry V. Levin wrote:
> On Wed, Mar 09, 2011 at 05:15:30PM +0000, Denys Vlasenko wrote:
> > --- a/strace.c
> > +++ b/strace.c
> > @@ -2637,6 +2637,8 @@ Process %d attached (waiting for parent)\n",
> >                     }
> >                     if (cflag != CFLAG_ONLY_STATS
> >                         && (qual_flags[WSTOPSIG(status)] & QUAL_SIGNAL)) {
> > +                           siginfo_t si;
> > +                           int entered_stopped_state;
> >                             unsigned long addr = 0;
> >                             long pc = 0;
> >  #if defined(PT_CR_IPSR) && defined(PT_CR_IIP) && defined(PT_GETSIGINFO)
> > @@ -2653,15 +2655,30 @@ Process %d attached (waiting for parent)\n",
> >  #elif defined PTRACE_GETSIGINFO
> >                             if (WSTOPSIG(status) == SIGSEGV ||
> >                                 WSTOPSIG(status) == SIGBUS) {
> > -                                   siginfo_t si;
> >                                     if (ptrace(PTRACE_GETSIGINFO, pid,
> >                                                0, &si) == 0)
> >                                             addr = (unsigned long)
> 
> Missing ChangeLog entry is not the only problem with this commit.
> The PT_CR_IPSR && PT_CR_IIP && PT_GETSIGINFO case won't compile.

My apologies, I did not notice that there is another variable named 'si'
in the same scope.

It is easy to just use additional "siginfo_t si" in the added if () {}
block and hope gcc is smart enough to reuse the same slot for both
structs instead of doing this optimization by hand...

Here is it. Please take a look at this fixed version.

-- 
vda


Show job control stop differently from signal notification

* strace.c (trace): Query PTRACE_GETSIGINFO on stop signals,
if it fails, show "--- stopped by SIGFOO ---"
to indicate that tracee is in job control stop now.


diff -d -urpN strace.0/strace.c strace.1/strace.c
--- strace.0/strace.c   2011-02-14 20:11:45.690110153 +0100
+++ strace.1/strace.c   2011-03-10 12:15:14.259222703 +0100
@@ -2626,6 +2626,7 @@ Process %d attached (waiting for parent)
                        }
                        if (cflag != CFLAG_ONLY_STATS
                            && (qual_flags[WSTOPSIG(status)] & QUAL_SIGNAL)) {
+                               int in_job_control_stop;
                                unsigned long addr = 0;
                                long pc = 0;
 #if defined(PT_CR_IPSR) && defined(PT_CR_IIP) && defined(PT_GETSIGINFO)
@@ -2649,8 +2650,25 @@ Process %d attached (waiting for parent)
                                                        si.si_addr;
                                }
 #endif
+                               in_job_control_stop = 0;
+                               if (WSTOPSIG(status) == SIGSTOP ||
+                                   WSTOPSIG(status) == SIGTSTP ||
+                                   WSTOPSIG(status) == SIGTTIN ||
+                                   WSTOPSIG(status) == SIGTTOU) {
+                                       /*
+                                        * PTRACE_GETSIGINFO fails if this is
+                                        * genuine *stop* notification,
+                                        * not *signal* notification
+                                        */
+                                       siginfo_t si;
+                                       if (ptrace(PTRACE_GETSIGINFO, pid,
+                                                   0, &si) != 0)
+                                               in_job_control_stop = 1;
+                               }
                                printleader(tcp);
-                               tprintf("--- %s (%s) @ %lx (%lx) ---",
+                               tprintf(in_job_control_stop
+                                       ? "--- stopped by %s ---"
+                                       : "--- %s (%s) @ %lx (%lx) ---",
                                        signame(WSTOPSIG(status)),
                                        strsignal(WSTOPSIG(status)), pc, addr);
                                printtrailer();



------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Strace-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to