Re: [RFC 2/3] use reinsert breakpoint for vCont;s

Yao Qi
2016-05-11T10:41:20Z

Yao Qi <qiyaoltc@gmail.com> writes:

> +
> + if (!step_over_finished && !can_hardware_single_step ())
> + {
> + /* If the thread resumed by resume_step hits the reinsert
> + breakpoint, delete the reinsert breakpoint for it. */
> + if (current_thread->last_resume_kind == resume_step)
> + delete_reinsert_breakpoints (current_thread);
> + else
> + {
> + /* If the thread resumed by other kind, like
> + resume_continue, hits the breakpoint (either
> + reinsert breakpoint or GDB breakpoint), delete
> + all reinsert breakpoints if it hits non-reinsert
> + breakpoints, otherwise, leave reinsert breakpoint there
> + and step over it. */
> + if (non_reinsert_breakpoint_inserted_here (event_child->stop_pc))
> + delete_reinsert_breakpoints (NULL);
> + }
> + }
> }
> else
> {
> /* We have some other signal, possibly a step-over dance was in
> progress, and it should be cancelled too. */
> step_over_finished = finish_step_over (event_child);
> +
> + if (!step_over_finished && !can_hardware_single_step ())
> + delete_reinsert_breakpoints (NULL);
> }
>
> /* We have all the data we need. Either report the event to GDB, or
> @@ -3568,6 +3590,8 @@ linux_wait_1 (ptid_t ptid,
>
> /* Alright, we're going to report a stop. */
>
> + delete_reinsert_breakpoints (NULL);
> +

The SIGILL is caused by removing these reinsert breakpoints when threads
are still running. I adjust the code removing reinsert breakpoints when
threads stop, the SIGILL goes away.

--
Yao (齐尧)