This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC] Add support of software single step to process record


Sorry guys, the prev patch is so ugly.

Thanks for teach me clear about the gdbarch_software_single_step, Pedro.
I did some extend with your idea.  Because record_wait need
record_resume_step point out this resume is signal step or continue.

      if (!step)
        {
          /* This is not hard single step.  */
          if (!gdbarch_software_single_step_p (gdbarch))
            {
              /* This is a normal continue.  */
              step = 1;
            }
          else
            {
              /* This arch support soft sigle step.  */
              if (single_step_breakpoints_inserted ())
                {
                  /* This is a soft single step.  */
                  record_resume_step = 1;
                }
              else
                {
                  /* This is a continue.
                     Try to insert a soft single step breakpoint.  */
                  if (!gdbarch_software_single_step (gdbarch,
                                                     get_current_frame ()))
                    {
                      /* This system don't want use soft single step.
                         Use hard sigle step.  */
                      step = 1;
                    }
                }
            }
        }

Shuchuang, please help me try this patch.  Thanks.

Best regards,
Hui


2010-01-04  Hui Zhu  <teawater@gmail.com>

	* breakpoint.c (single_step_breakpoints_inserted): New
	function.
	* breakpoint.h (single_step_breakpoints_inserted): Extern.
	* record.c (record_resume): Add code for software single step.
	(record_wait): Ditto.

On Fri, Dec 25, 2009 at 01:38, Pedro Alves <pedro@codesourcery.com> wrote:
> On Wednesday 23 December 2009 09:23:21, Hui Zhu wrote:
>> + ? ? ?struct gdbarch *gdbarch = target_thread_architecture (ptid);
>> +
>> ? ? ? ?record_message (get_current_regcache (), signal);
>
>> ? ? ? ?record_beneath_to_resume (record_beneath_to_resume_ops, ptid, 1,
>> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?signal);
>
> Why is this resume call still present?
>
>> +
>> + ? ? ? if (gdbarch_software_single_step_p (gdbarch))
>> + ? ? ? ? {
>> + ? ? ? ? ? if (!inserted_single_step_breakpoint_p ())
>
> Isn't this naming stale? ?I thought you had renamed this.
>
>> + ? ? ? ? ? ? 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);
>> ? ? ?}
>>
>
> You've got the predicates a bit mixed up.
>
> ?- gdbarch_software_single_step_p purpose is only "is there or
> ? not a gdbarch_software_single_step callback registered in
> ? this gdbarch"? ?It returning true does not mean that
> ? software single-step should be used for that single-step.
>
> ?- gdbarch_software_single_step can return false, meaning,
> ? no software single-step needs to be used.
>
> This is how stepping over atomic sequences is handled
> currently (grep for deal_with_atomic_sequence):
> gdbarch_software_single_step_p returns true, but
> gdbarch_software_single_step returns false most
> of the times. ?See also infrun.c:maybe_software_singlestep.
>
> I think you want this:
>
> ? ? ? if (!step
> ? ? ? ? ? && gdbarch_software_single_step_p (gdbarch)
> ? ? ? ? ? && !single_step_breakpoints_inserted ()
> ? ? ? ? ? && gdbarch_software_single_step (gdbarch, get_current_frame ()))
> ? ? ? ? record_resume_step = 0;
> ? ? ? else
> ? ? ? ? record_resume_step = 1;
>
> ? ? ? record_beneath_to_resume (record_beneath_to_resume_ops, ptid,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? record_resume_step, signal);
>
> If `step' is true when record_resume is called, and so is
> gdbarch_software_single_step_p, then it must be that infrun.c
> already determined that gdbarch_software_single_step returns
> false, otherwise, `step' would be false (maybe_software_singlestep).
>
> If `step' is false (the user is requesting a continue), and
> no single-step breakpoints are inserted yet, but,
> gdbarch_software_single_step returns false, we have ourselves
> an arch/target combo that only wants software single-stepping
> for atomic sequences, e.g., MIPS (non-linux), or PPC. ?If
> so, we should force hardware single-step in the target
> beneath (set record_resume_step to 1).
>
> --
> Pedro Alves
>

Attachment: prec_software_single_step.txt
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]