gdb/18216: displaced step+deliver signal, a thread needs step-over, crash
The problem is that with hardware step targets and displaced stepping, "signal FOO" when stopped at a breakpoint steps the breakpoint instruction at the same time it delivers a signal. This results in tp->stepped_breakpoint set, but no step-resume breakpoint set. When the next stop event arrives, GDB crashes. Irrespective of whether we should do something more/different to step past the breakpoint in this scenario (e.g., PR 18225), it's just wrong to assume there'll be a step-resume breakpoint set (and was not the original intention). gdb/ChangeLog: 2015-04-10 Pedro Alves <palves@redhat.com> PR gdb/18216 * infrun.c (process_event_stop_test): Don't assume a step-resume is set if tp->stepped_breakpoint is true. gdb/testsuite/ChangeLog: 2015-04-10 Pedro Alves <palves@redhat.com> PR gdb/18216 * gdb.threads/multiple-step-overs.exp: Remove expected eof.
This commit is contained in:
parent
ef713951c5
commit
8d707a12ef
@ -1,3 +1,9 @@
|
||||
2015-04-10 Pedro Alves <palves@redhat.com>
|
||||
|
||||
PR gdb/18216
|
||||
* infrun.c (process_event_stop_test): Don't assume a step-resume
|
||||
is set if tp->stepped_breakpoint is true.
|
||||
|
||||
2015-04-10 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* arm-tdep.c (install_alu_reg): Update comment.
|
||||
|
@ -4961,7 +4961,8 @@ process_event_stop_test (struct execution_control_state *ecs)
|
||||
struct breakpoint *sr_bp
|
||||
= ecs->event_thread->control.step_resume_breakpoint;
|
||||
|
||||
if (sr_bp->loc->permanent
|
||||
if (sr_bp != NULL
|
||||
&& sr_bp->loc->permanent
|
||||
&& sr_bp->type == bp_hp_step_resume
|
||||
&& sr_bp->loc->address == ecs->event_thread->prev_pc)
|
||||
{
|
||||
|
@ -1,3 +1,8 @@
|
||||
2015-04-10 Pedro Alves <palves@redhat.com>
|
||||
|
||||
PR gdb/18216
|
||||
* gdb.threads/multiple-step-overs.exp: Remove expected eof.
|
||||
|
||||
2015-04-10 Yao Qi <yao.qi@linaro.org>
|
||||
|
||||
* gdb.arch/arm-disp-step.S (main): Call test_add_rn_pc.
|
||||
|
@ -118,13 +118,6 @@ foreach displaced { "off" "on" } {
|
||||
}
|
||||
fail $msg
|
||||
}
|
||||
eof {
|
||||
if {[can_single_step_to_signal_handler]
|
||||
&& $displaced == "on"} {
|
||||
setup_kfail "gdb/18216" "*-*-*"
|
||||
}
|
||||
fail $msg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user