diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index db76e1a0ccb..e0ed616aba9 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2016-04-22 Yao Qi + + * 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 * linux-s390-low.c (s390_collect_ptrace_register) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 7630f9f81a4..5cbd3088ef1 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 29447afc6bf..249cbc0b095 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-04-22 Yao Qi + + * gdb.trace/signal.exp: Also pass if + $tracepoint_hits($i) > $iterations. + 2016-04-22 Yao Qi * gdb.trace/signal.c: New file. diff --git a/gdb/testsuite/gdb.trace/signal.exp b/gdb/testsuite/gdb.trace/signal.exp index 7118a9fea75..48e495ee78e 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" + } }