[RFC] Add support of software single step to process record
Michael Snyder
msnyder@vmware.com
Fri Dec 18 19:37:00 GMT 2009
Hui Zhu wrote:
> Hi guys,
>
> This patch to make prec support software single step.
> I just try it with i386. Shuchang, please help me try it on mips. :)
>
> BTW, There are still some other patches for record_resume and
> record_wait. And other arch patch is still not begin to be review. So
> this patch is not very urgency. It just help the guys that are
> working on prec arch porting.
Seems OK in principle. Thanks for adding a nice clean API to breakpoint.
> 2009-12-18 Hui Zhu <teawater@gmail.com>
>
> * breakpoint.c (inserted_single_step_breakpoint_p): New
> function.
> * breakpoint.h (inserted_single_step_breakpoint_p): Extern.
> * record.c (record_resume): Add code for software single step.
> (record_wait): Ditto.
>
> ---
> breakpoint.c | 12 ++++++++++++
> breakpoint.h | 1 +
> record.c | 35 ++++++++++++++++++++++++++++++-----
> 3 files changed, 43 insertions(+), 5 deletions(-)
>
> --- a/breakpoint.c
> +++ b/breakpoint.c
> @@ -9624,6 +9624,18 @@ insert_single_step_breakpoint (struct gd
> paddress (gdbarch, next_pc));
> }
>
> +/* Check if the breakpoints used for software single stepping
> inserted or not. */
> +
> +int
> +inserted_single_step_breakpoint_p (void)
> +{
> + if (single_step_breakpoints[0] != NULL
> + || single_step_breakpoints[1] != NULL)
> + return 1;
> +
> + return 1;
> +}
> +
> /* Remove and delete any breakpoints used for software single step. */
>
> void
> --- a/breakpoint.h
> +++ b/breakpoint.h
> @@ -944,6 +944,7 @@ extern int remove_hw_watchpoints (void);
> twice before remove is called. */
> extern void insert_single_step_breakpoint (struct gdbarch *,
> struct address_space *, CORE_ADDR);
> +extern int inserted_single_step_breakpoint_p (void);
> extern void remove_single_step_breakpoints (void);
>
> /* Manage manual breakpoints, separate from the normal chain of
> --- a/record.c
> +++ b/record.c
> @@ -995,6 +995,8 @@ record_resume (struct target_ops *ops, p
>
> if (!RECORD_IS_REPLAY)
> {
> + struct gdbarch *gdbarch = get_current_arch ();
> +
> if (do_record_message (get_current_regcache (), signal))
> {
> record_resume_error = 0;
> @@ -1004,8 +1006,18 @@ record_resume (struct target_ops *ops, p
> record_resume_error = 1;
> return;
> }
> - record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1,
> - signal);
> +
> + if (gdbarch_software_single_step_p (gdbarch))
> + {
> + if (!inserted_single_step_breakpoint_p ())
> + gdbarch_software_single_step (gdbarch, get_current_frame ());
> + record_beneath_to_resume (record_beneath_to_resume_ops,
> + ptid, step, signal);
> + record_resume_step = 0;
> + }
> + else
> + record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1,
> + signal);
> }
> }
>
> @@ -1086,6 +1098,7 @@ record_wait (struct target_ops *ops,
> /* This is not a single step. */
> ptid_t ret;
> CORE_ADDR tmp_pc;
> + struct gdbarch *gdbarch = get_current_arch ();
>
> while (1)
> {
> @@ -1108,6 +1121,9 @@ record_wait (struct target_ops *ops,
> tmp_pc = regcache_read_pc (regcache);
> aspace = get_regcache_aspace (regcache);
>
> + if (gdbarch_software_single_step_p (gdbarch))
> + remove_single_step_breakpoints ();
> +
> if (target_stopped_by_watchpoint ())
> {
> /* Always interested in watchpoints. */
> @@ -1133,9 +1149,18 @@ record_wait (struct target_ops *ops,
> if (!do_record_message (regcache, TARGET_SIGNAL_0))
> break;
>
> - record_beneath_to_resume (record_beneath_to_resume_ops,
> - ptid, 1,
> - TARGET_SIGNAL_0);
> + if (gdbarch_software_single_step_p (gdbarch))
> + {
> + gdbarch_software_single_step (gdbarch,
> + get_current_frame ());
> + record_beneath_to_resume
> (record_beneath_to_resume_ops,
> + ptid, 0,
> + TARGET_SIGNAL_0);
> + }
> + else
> + record_beneath_to_resume (record_beneath_to_resume_ops,
> + ptid, 1,
> + TARGET_SIGNAL_0);
> continue;
> }
> }
More information about the Gdb-patches
mailing list