This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 4/8] Force to insert software single step breakpoint
- From: Pedro Alves <palves at redhat dot com>
- To: Yao Qi <qiyaoltc at gmail dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Thu, 17 Mar 2016 12:40:04 +0000
- Subject: Re: [PATCH 4/8] Force to insert software single step breakpoint
- Authentication-results: sourceware.org; auth=none
- References: <1457088276-1170-1-git-send-email-yao dot qi at linaro dot org> <1457088276-1170-5-git-send-email-yao dot qi at linaro dot org> <56E2B0C2 dot 705 at redhat dot com> <86egbay78l dot fsf at gmail dot com>
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