diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 10 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.trace/signal.exp | 12 |
4 files changed, 28 insertions, 5 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index db76e1a..e0ed616 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2016-04-22 Yao Qi <yao.qi@linaro.org> + + * linux-low.c (lwp_signal_can_be_delivered): Don't deliver + signal when stepping over breakpoint with software single + step. + 2016-04-21 Pedro Alves <palves@redhat.com> * linux-s390-low.c (s390_collect_ptrace_register) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 7630f9f..5cbd308 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -4119,13 +4119,17 @@ single_step (struct lwp_info* lwp) } /* The signal can be delivered to the inferior if we are not trying to - reinsert a breakpoint and not trying to finish a fast tracepoint - collect. */ + reinsert a breakpoint for software single step and not trying to + finish a fast tracepoint collect. Since signal can be delivered in + the step-over, the program may go to signal handler and trap again + after return from the signal handler. We can live with the spurious + double traps. */ static int lwp_signal_can_be_delivered (struct lwp_info *lwp) { - return (lwp->bp_reinsert == 0 && !lwp->collecting_fast_tracepoint); + return (!(lwp->bp_reinsert != 0 && can_software_single_step ()) + && !lwp->collecting_fast_tracepoint); } /* Resume execution of LWP. If STEP is nonzero, single-step it. If diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 29447af..249cbc0 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2016-04-22 Yao Qi <yao.qi@linaro.org> + * gdb.trace/signal.exp: Also pass if + $tracepoint_hits($i) > $iterations. + +2016-04-22 Yao Qi <yao.qi@linaro.org> + * gdb.trace/signal.c: New file. * gdb.trace/signal.exp: New file. diff --git a/gdb/testsuite/gdb.trace/signal.exp b/gdb/testsuite/gdb.trace/signal.exp index 7118a9f..48e495e 100644 --- a/gdb/testsuite/gdb.trace/signal.exp +++ b/gdb/testsuite/gdb.trace/signal.exp @@ -174,6 +174,14 @@ while { 1 } { # Step 3, check the number of collections on each tracepoint. for { set i $tpnum } { $i < [expr $tpnum + 2] } { incr i } { - gdb_assert { $tracepoint_hits($i) == $iterations } \ - "tracepoint $i hit $iterations times" + + if { $tracepoint_hits($i) == $iterations } { + pass "tracepoint $i hit $iterations times" + } elseif { $tracepoint_hits($i) > $iterations } { + # GDBserver deliver the signal while stepping over tracepoint, + # so it is possible that a tracepoint is collected twice. + pass "tracepoint $i hit $iterations times (spurious collection)" + } else { + fail "tracepoint $i hit $iterations times" + } } |