Re: [PATCH 3/5] range stepping: gdb

Pedro Alves
2013-05-15T10:23:30Z

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