Resume the inferior with signal rather than stepping over
When GDBserver steps over a breakpoint using software single step, it enqueues the signal, single step and deliver the signal in the next resume if step over is not needed. In this way, the program won't receive the signal if the conditional breakpoint is set a branch to self instruction, because the step over is always needed. This patch removes the restriction that don't deliver the signal to the inferior if we are trying to reinsert a breakpoint for software single step and change the decision on resume vs. step-over when the LWP has pending signals to deliver. gdb/gdbserver: 2016-04-25 Yao Qi <yao.qi@linaro.org> * linux-low.c (lwp_signal_can_be_delivered): Adjust. (need_step_over_p): Return zero if the LWP has pending signals can be delivered on software single step target.
This commit is contained in:
parent
85ba7d867a
commit
484b3c325d
@ -1,3 +1,9 @@
|
||||
2016-04-25 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* linux-low.c (lwp_signal_can_be_delivered): Adjust.
|
||||
(need_step_over_p): Return zero if the LWP has pending signals
|
||||
can be delivered on software single step target.
|
||||
|
||||
2016-04-25 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* linux-low.c (reinsert_raw_breakpoint): If bp->inserted is true
|
||||
|
@ -4119,7 +4119,6 @@ single_step (struct lwp_info* lwp)
|
||||
}
|
||||
|
||||
/* The signal can be delivered to the inferior if we are not trying to
|
||||
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
|
||||
@ -4128,8 +4127,7 @@ single_step (struct lwp_info* lwp)
|
||||
static int
|
||||
lwp_signal_can_be_delivered (struct lwp_info *lwp)
|
||||
{
|
||||
return (!(lwp->bp_reinsert != 0 && can_software_single_step ())
|
||||
&& !lwp->collecting_fast_tracepoint);
|
||||
return !lwp->collecting_fast_tracepoint;
|
||||
}
|
||||
|
||||
/* Resume execution of LWP. If STEP is nonzero, single-step it. If
|
||||
@ -4578,6 +4576,20 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* On software single step target, resume the inferior with signal
|
||||
rather than stepping over. */
|
||||
if (can_software_single_step ()
|
||||
&& lwp->pending_signals != NULL
|
||||
&& lwp_signal_can_be_delivered (lwp))
|
||||
{
|
||||
if (debug_threads)
|
||||
debug_printf ("Need step over [LWP %ld]? Ignoring, has pending"
|
||||
" signals.\n",
|
||||
lwpid_of (thread));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
saved_thread = current_thread;
|
||||
current_thread = thread;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user