This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 3/5] range stepping: gdb
- From: Pedro Alves <palves at redhat dot com>
- To: Eli Zaretskii <eliz at gnu dot org>
- Cc: gdb-patches at sourceware dot org
- Date: Wed, 15 May 2013 11:23:24 +0100
- Subject: Re: [PATCH 3/5] range stepping: gdb
- References: <20130514191026 dot 13213 dot 39574 dot stgit at brno dot lan> <20130514191047 dot 13213 dot 8476 dot stgit at brno dot lan> <83k3n173ao dot fsf at gnu dot org>
On 05/14/2013 08:46 PM, Eli Zaretskii wrote:
>> From: Pedro Alves <palves@redhat.com>
>> Date: Tue, 14 May 2013 20:10:47 +0100
>>
>> When user issues the "step" command on the following line of source,
>>
>> a = b + c + d * e - a;
>>
>> GDB single-steps every single instruction until the program reaches a
>> new different line.
>
> I always thought that GDB sets a temporary breakpoint at the end, and
> then lets the target run freely. Why not?
Because we don't know whether there are instructions in the line that
jump/branch to a different place. We'd miss the breakpoint and lose
control.
>
>> +@var{end} is the address of the first instruction beyond the step
>> +range, and @strong{not} the address of the last instruction within it.
>> +(This has the property that @var{start} == @var{end} single-steps
>> +once, and only once, even if the instruction at @var{start} jumps to
>> +@var{end}.)
>
> This sentence in parentheses got me completely confused. Before
> reading it, I thought I understood what is this about; now I don't.
> In particular, if START is equal to END, then how in the world could
> the instruction at START jump to END?
Sorry, I had that typo in the gdbserver code as well, fixed it
there, but missed this one.
It should read, even if the instruction at @var{start} jumps to @var{start}.
vCont;r first steps, then checks. IOW:
vCont ;r ADDR1,ADDR1
is equivalent to (and could be thought to supersede):
vCont ;s
> And if END is excluded from the
> range, then why when START equals END do we step at all? Please
> explain.
It's just a design decision. I recall at least one target I saw I worked
with that supported range stepping, and it didn't even a distinction
between range vs no-range step commands. The way to do a single step
was to pass both addresses the same. I find it a better design than
requiring the target do one current-address check _before_ stepping,
and another _after_ single-stepping.
--
Pedro Alves