[PATCH 4/8] Force to insert software single step breakpoint

Pedro Alves palves@redhat.com
Thu Mar 17 12:40:00 GMT 2016


On 03/16/2016 11:47 AM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
> 
>> Hmm, I think we might need to do something else.
>>
>> If you put a breakpoint there, then the instruction under
>> the breakpoint won't execute at all.
> 
> That is intended, because if the instruction is executed, it can't be
> stopped.
> 
>>
>> If it's a conditional branch, and the condition is false,
>> we will fail to ever advance past the instruction.
>>
>> Similarly if the branch instruction happens to have important
>> side effects (flags? counters?).
> 
> We can switch to displaced stepping if we find the instruction may
> branch to itself.  Say, we can change gdbarch software_single_step to
> return a vector of dest addresses of current pc and caller inserts
> software single step breakpoints to these dest addresses.  If any
> element of vector equals to the current pc, switch to displaced
> stepping if supported.  What do you think?

That's not possible on the gdbserver side, however.

Maybe what we need to do is firmly declare (and add comments in that
direction) that the arch's get_next_pcs implementation must always evaluate 
the condition of conditional branches, and not put a breakpoint at the
branch destination if the condition is false, thus ensuring forward progress.
The ARM implementation does this, though I haven't checked whether all the
branch instructions are covered.  Some other archs don't, and always put
a break at the branch destination, like e.g., moxie_software_single_step.

If we find some instruction where that is still not be sufficient,
due to side effects, then maybe gdb and gdbserver could first
try emulating the instruction's side effects manually.  And only
if that doesn't work, then try displaced stepping.  We could leave
that for later, until we find a need.

WDYT?

Thanks,
Pedro Alves



More information about the Gdb-patches mailing list