From: Yao Qi <qiyaoltc@gmail.com>
To: Pedro Alves <palves@redhat.com>
Cc: Yao Qi <qiyaoltc@gmail.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 3/8] Deliver signal in hardware single step
Date: Wed, 16 Mar 2016 10:47:00 -0000 [thread overview]
Message-ID: <86io0mya1n.fsf@gmail.com> (raw)
In-Reply-To: <56E2AE04.7030306@redhat.com> (Pedro Alves's message of "Fri, 11 Mar 2016 11:37:40 +0000")
Pedro Alves <palves@redhat.com> writes:
Hi Pedro,
> - If there's a signal handler installed, we'll stop at its entry,
> but we haven't stepped over the original breakpoint yet. If we
> were already stopped at the entry of the signal handler, and it
> nested, we'll find the program stopped at the same PC it had
> started at. But we won't know whether the step-over finished
> successfully (could be a "jmp $pc" instruction), or if instead we're
> in a new handler invocation, and thus this is a new,
> separate breakpoint hit.
GDBserver doesn't have to tell the program stopped at the same PC
it had started at when step over is finished. When step over, GDBserver
uninsert breakpoint, resumes the lwp, and wait the next event from the
lwp. Once the event from the lwp arrives, GDBserver reinsert breakpoint
and thinks step over is finished. That is all ...
>
> A signal handler that segfaults in the first instruction
> would be the easiest way to reproduce this that I can think of.
> (If it's crashing, you'd expect the user might try putting a
> breakpoint there.)
I write a case like this, set the conditional breakpoint on the first
instruction of handler, and looks breakpoint condition in target side
still works properly.
(gdb) disassemble handler
Dump of assembler code for function handler:
0x0000000000400586 <+0>: movb $0x0,0x0
0x000000000040058e <+8>: retq
(gdb) p/x $rsp
$1 = 0x7fffffffde00
(gdb) b *handler if $rsp < 0x7fffffffde00 - 3300
the condition like this can guarantee that the condition will be true
after several recursions.
>
> Now, if after stepping into the handler, we immediately reinsert the
> breakpoint and continue, we'll retrap it, it ends up OK.
breakpoint is reinserted after stepping into the handler, because
GDBserver thinks step over is finished, as I said above.
> But if we immediately instead start a new step-over for the same
> breakpoint address, we will miss the new hit, and nest a new handler,
> on and on.
This won't happen. After hardware single step with signal delivered,
the program stops at the entry of handler, and GDBserver gets an event.
Then, GDBserver thinks step over is finished, and then proceed all lwps.
However, the thread still stopped at the breakpoint (of different
stack frames), so it needs step over again. The loop like this will go
on until the breakpoint condition is true, need_step_over_p decides to
resume rather than step over. The program will hit the breakpoint, and
GDBserver reports the event back to GDB.
Note in my experiment with the test case above, I don't let GDBserver
treat SIGSEGV as SIGTRAP, otherwise SIGSEGV will be reported back to GDB.
--
Yao (齐尧)
next prev parent reply other threads:[~2016-03-16 10:47 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-04 10:44 [PATCH 0/8] Step over instruction branches to itself Yao Qi
2016-03-04 10:44 ` [PATCH 1/8] Set signal to 0 after enqueue_pending_signal Yao Qi
2016-03-11 10:53 ` Pedro Alves
2016-03-18 14:36 ` Yao Qi
2016-03-04 10:44 ` [PATCH 3/8] Deliver signal in hardware single step Yao Qi
2016-03-11 11:05 ` Pedro Alves
2016-03-11 11:09 ` Pedro Alves
2016-03-11 11:37 ` Pedro Alves
2016-03-16 10:47 ` Yao Qi [this message]
2016-03-17 12:12 ` Pedro Alves
2016-03-04 10:44 ` [PATCH 4/8] Force to insert software single step breakpoint Yao Qi
2016-03-11 11:49 ` Pedro Alves
2016-03-16 11:47 ` Yao Qi
2016-03-17 12:40 ` Pedro Alves
2016-03-18 14:25 ` Yao Qi
2016-03-18 15:03 ` Pedro Alves
2016-03-04 10:44 ` [PATCH 2/8] Check LWP_SIGNAL_CAN_BE_DELIVERED for enqueue/dequeue pending signals Yao Qi
2016-03-11 10:55 ` Pedro Alves
2016-03-17 8:40 ` Yao Qi
2016-03-17 11:07 ` Pedro Alves
2016-03-18 14:36 ` Yao Qi
2016-03-16 17:02 ` Luis Machado
2016-03-04 10:44 ` [PATCH 7/8] Resume the inferior with signal rather than stepping over Yao Qi
2016-03-11 12:04 ` Pedro Alves
2016-03-21 9:40 ` Yao Qi
2016-03-04 10:44 ` [PATCH 6/8] [GDBserver] Don't error in reinsert_raw_breakpoint if bp->inserted Yao Qi
2016-03-04 10:45 ` [PATCH 8/8] New test case gdb.base/branch-to-self.exp Yao Qi
2016-03-04 10:45 ` [PATCH 5/8] Insert breakpoint even when the raw breakpoint is found Yao Qi
2016-03-11 11:54 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86io0mya1n.fsf@gmail.com \
--to=qiyaoltc@gmail.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox