Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Pedro Alves <palves@redhat.com>
Cc: gdb@sourceware.org
Subject: Re: Inadvertently run inferior threads
Date: Mon, 15 Jun 2015 15:27:00 -0000	[thread overview]
Message-ID: <83si9tngaj.fsf@gnu.org> (raw)
In-Reply-To: <557ED083.1060804@redhat.com>

> Date: Mon, 15 Jun 2015 14:17:55 +0100
> From: Pedro Alves <palves@redhat.com>
> CC: gdb@sourceware.org
> 
> On 06/11/2015 02:41 PM, Eli Zaretskii wrote:
> 
> > And I have a question about your description of what happens on
> > GNU/Linux.  You say:
> > 
> >>  #4 - result: _new_ threads end up in "running" state, even though they
> >>     are stopped.
> > 
> > My question is this: who or what stops the new threads that were
> > started by the function we infcall'ed?  I know who stops them on
> > MS-Windows: the OS.
> 
> GDB does, from within the target's target_wait implementation.
> For Linux, it's in linux-nat.c:linux_nat_wait_1:

I guess this happens unless the breakpoint was thread-specific, right?
Otherwise the async execution would be much less useful, I presume.
But I digress.

> > If so, I don't understand why we suppress
> > the stopped <-> running transitions when in infcall.  Or at least the
> > running -> stopped transition.  The comment in normal_stop tries to
> > explain this:
> 
> Say you have a breakpoint with a condition that does an infcall, like:
> 
>  int return_false (void) { return 0 };
> 
>  (gdb) b somewhere_in_a_loop if return_false()
>  (gdb) c
> 
> >From the perspective of the user, the thread is always running
> after that "c".  The breakpoint stops for both "somewhere_in_a_loop" and
> for the infcall's dummy breakpoint are all internal run control
> machinery details.

I'm not sure I follow.  From this user's (admittedly semi-naive) POV,
what happens with such a breakpoint is this:

  . Inferior hits the breakpoint and stops; the thread is now "not
    running".

  . GDB gets control and evaluates the condition.

  . When GDB issues the infcall, as part of evaluating the condition,
    the thread resumes -- now it is "running".

  . The thread that runs the infcall reaches the end of the function
    and stops at the temporary breakpoint GDB inserted there -- the
    thread is again "not running".

  . GDB evaluates the return value, decides that the condition was not
    fulfilled, and resumes the inferior -- the thread is now "running"
    again.  Or GDB decides that the condition _was_ fulfilled, in
    which case the thread stays at its "not running" state.

So it sounds to me that if we faithfully reflect the actual running
state of the thread during this scenario, without any exceptions or
exemptions, we are good.  You say "internal run control machinery
details", but since these controls actually run and stop user threads,
I don't see why we should work so hard to conceal them, and in the
process shoot ourselves in the foot.

What am I missing?

Thanks for taking the time to explain these details.


  reply	other threads:[~2015-06-15 15:27 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-12 17:11 Eli Zaretskii
2015-03-14 13:40 ` Pedro Alves
2015-03-14 14:56   ` Eli Zaretskii
2015-03-14 15:36     ` Pedro Alves
2015-03-14 15:51       ` Pedro Alves
2015-03-14 15:58         ` Pedro Alves
2015-06-10 15:15           ` Eli Zaretskii
2015-03-14 16:06         ` Eli Zaretskii
2015-06-10 15:50         ` Eli Zaretskii
2015-06-11 13:42           ` Eli Zaretskii
2015-06-15 13:18             ` Pedro Alves
2015-06-15 15:27               ` Eli Zaretskii [this message]
2015-06-15 15:42                 ` Pedro Alves
2015-06-23  4:07                   ` Doug Evans
2015-06-23 12:19                     ` Pedro Alves
2015-06-23 19:11                       ` Pedro Alves
2015-06-23 19:52                         ` Eli Zaretskii
2015-06-24 14:29                           ` Eli Zaretskii
2015-06-29 15:57                             ` Pedro Alves
2015-06-23 14:58                     ` Eli Zaretskii
2015-06-15 13:01           ` Pedro Alves
2015-06-15 15:14             ` Eli Zaretskii
2015-06-15 15:28               ` Pedro Alves
2015-06-15 17:21                 ` Eli Zaretskii
2015-06-15 17:56                   ` Pedro Alves
2015-06-15 19:07                     ` Eli Zaretskii
2015-06-23 11:51                     ` Pedro Alves
2015-03-14 16:04       ` Eli Zaretskii
2015-03-14 16:15         ` Pedro Alves
2015-03-14 16:17           ` Eli Zaretskii
2015-03-14 16:23             ` Pedro Alves
2015-03-14 17:01               ` Eli Zaretskii
2015-03-14 17:46                 ` Pedro Alves
2015-06-10 15:13     ` Eli Zaretskii
2015-06-15 13:08       ` Pedro Alves
2015-06-15 15:15         ` Eli Zaretskii

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=83si9tngaj.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=gdb@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