public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Context-switch in finish-step-over flow
@ 2020-04-20 16:24 Tankut Baris Aktemur
  2020-04-20 16:24 ` [PATCH 1/2] testsuite: introduce 'default_gdb_start_post_cmd' as an overridable function Tankut Baris Aktemur
  2020-04-20 16:24 ` [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore' Tankut Baris Aktemur
  0 siblings, 2 replies; 5+ messages in thread
From: Tankut Baris Aktemur @ 2020-04-20 16:24 UTC (permalink / raw)
  To: gdb-patches; +Cc: palves

Hi,

While addressing Pedro's comments to a patch about 'stop_all_threads' at

  https://sourceware.org/pipermail/gdb-patches/2020-April/167664.html

the need for this two-part series arose.  This small series will act as
as a predecessor to the next revision of the patch linked above.

Regards.
Baris


Tankut Baris Aktemur (2):
  testsuite: introduce 'default_gdb_start_post_cmd' as an overridable
    function
  gdb/infrun: switch the context before 'displaced_step_restore'

 gdb/infrun.c                                  | 11 +++--
 gdb/testsuite/gdb.multi/run-only-second-inf.c | 22 +++++++++
 .../gdb.multi/run-only-second-inf.exp         | 49 +++++++++++++++++++
 gdb/testsuite/lib/gdb.exp                     | 12 +++++
 4 files changed, 89 insertions(+), 5 deletions(-)
 create mode 100644 gdb/testsuite/gdb.multi/run-only-second-inf.c
 create mode 100644 gdb/testsuite/gdb.multi/run-only-second-inf.exp

-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] testsuite: introduce 'default_gdb_start_post_cmd' as an overridable function
  2020-04-20 16:24 [PATCH 0/2] Context-switch in finish-step-over flow Tankut Baris Aktemur
@ 2020-04-20 16:24 ` Tankut Baris Aktemur
  2020-04-20 16:24 ` [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore' Tankut Baris Aktemur
  1 sibling, 0 replies; 5+ messages in thread
From: Tankut Baris Aktemur @ 2020-04-20 16:24 UTC (permalink / raw)
  To: gdb-patches; +Cc: palves

Introduce a function named 'default_gdb_start_post_cmd' that is
invoked at the end of 'default_gdb_start'.  The function is by default
empty and can be overridden in a board file or a test to perform
setup right after GDB starts.

The need for this function arose from the fact that doing
'maint set target-non-stop on' was not possible when using the
native-extended-gdbserver board file.  This board file overrides
gdb_start as below:

  proc gdb_start { } {
      # Spawn GDB.
      default_gdb_start

      # And then GDBserver, ready for extended-remote mode.
      gdbserver_start_multi

      return 0
  }

That is, GDB is started and an extended-remote target is defined
immediately following it.  However, to set the remote target to
non-stop mode, we would have to issue the 'maint set target-non-stop on'
code ...

  proc gdb_start { } {
      # Spawn GDB.
      default_gdb_start

-->   ### ... right here.

      # And then GDBserver, ready for extended-remote mode.
      gdbserver_start_multi

      return 0
  }

If the target-non-stop mode is set after making the connection,
we see the following problem:

   $ gdb
   (gdb) file a.out
   ...
   (gdb) set remote exec-file a.out
   (gdb) target extended-remote | gdbserver --once --multi -
   ...
   (gdb) maint set target-non-stop on
   (gdb) run
   ...
   Unexpected vCont reply in non-stop mode: T05swbreak:;06:f0dfffffff7f0000;07:10deffffff7f0000;10:d194ddf7ff7f0000;thread:p4706.4706;core:d;

This patch provides a generalized solution and gives the ability to do
custom setup after starting GDB but before connecting to the target.

gdb/testsuite/ChangeLog:
2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* lib/gdb.exp (default_gdb_start_post_cmd): New overridable
	function.
	(default_gdb_start): Invoke 'default_gdb_start_post_cmd'
	at the end.
---
 gdb/testsuite/lib/gdb.exp | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 8418c3d8753..626edee6265 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1849,6 +1849,17 @@ proc default_gdb_spawn { } {
     return 0
 }
 
+# Overridable procedure that is called at the end of
+# default_gdb_start.
+
+proc default_gdb_start_post_cmd { } {
+    # Do nothing by default.
+    # You can override this in your board file or your test.
+    #
+    # E.g. Do "maint set target-non-stop on" to start in
+    # all-stop-on-top-of-non-stop mode.
+}
+
 # Default gdb_start procedure.
 
 proc default_gdb_start { } {
@@ -1919,6 +1930,7 @@ proc default_gdb_start { } {
     }
 
     gdb_debug_init
+    default_gdb_start_post_cmd
     return 0
 }
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore'
  2020-04-20 16:24 [PATCH 0/2] Context-switch in finish-step-over flow Tankut Baris Aktemur
  2020-04-20 16:24 ` [PATCH 1/2] testsuite: introduce 'default_gdb_start_post_cmd' as an overridable function Tankut Baris Aktemur
@ 2020-04-20 16:24 ` Tankut Baris Aktemur
  2020-04-21 14:38   ` Pedro Alves
  1 sibling, 1 reply; 5+ messages in thread
From: Tankut Baris Aktemur @ 2020-04-20 16:24 UTC (permalink / raw)
  To: gdb-patches; +Cc: palves

In infrun.c's 'displaced_step_fixup', as part of the 'finish_step_over'
flow, switch to the eventing thread *before* calling
'displaced_step_restore', because down in the flow ptid-dependent
memory accesses are used via current_inferior() and current_top_target().

Without this patch, the problem is exposed with the scenario below:

   $ gdb -q
   (gdb) maint set target-non-stop on
   (gdb) file a.out
   Reading symbols from a.out...
   (gdb) set remote exec-file a.out
   (gdb) target extended-remote | gdbserver --once --multi -
   ...
   (gdb) add-inferior
   [New inferior 2]
   Added inferior 2 on connection 1 (extended-remote ...)
   (gdb) inferior 2
   [Switching to inferior 2 [<null>] (<noexec>)]
   (gdb) file a.out
   Reading symbols from a.out...
   (gdb) set remote exec-file a.out
   (gdb) run
   ...
   Cannot access memory at address 0x555555555042
   (gdb)

The problem is, down inside 'displaced_step_restore', GDB wants to
access the memory for inferior 2 because of an internal breakpoint.
However, the current inferior and inferior_ptid are out of sync.
While inferior_ptid correctly points to the process of inf 2 that was
just started, current_inferior points to inf 1.  Then, the attempt to
access the memory fails, because target_has_execution results in false
since inf 1 was not started.  I was not able to simplify the failing
scenario, but it shows the problem.

After this patch, we get

  ... same steps above...
  (gdb) run
  ...
  [Inferior 2 (process 28652) exited normally]
  (gdb)

Regression-tested on X86_64 Linux with `make check`s default board file
and also `--target_board=native-extended-gdbserver`.  In fact, the bug
fixed by this patch was exposed when using the native-extended-gdbserver
board file.

gdb/ChangeLog:
2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* infrun.c (displaced_step_fixup): Switch to the event_thread
	before calling displaced_step_restore, not after.

gdb/testsuite/ChangeLog:
2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	* gdb.multi/run-only-second-inf.c: New file.
	* gdb.multi/run-only-second-inf.exp: New file.
---
 gdb/infrun.c                                  | 11 +++--
 gdb/testsuite/gdb.multi/run-only-second-inf.c | 22 +++++++++
 .../gdb.multi/run-only-second-inf.exp         | 49 +++++++++++++++++++
 3 files changed, 77 insertions(+), 5 deletions(-)
 create mode 100644 gdb/testsuite/gdb.multi/run-only-second-inf.c
 create mode 100644 gdb/testsuite/gdb.multi/run-only-second-inf.exp

diff --git a/gdb/infrun.c b/gdb/infrun.c
index 5d60e64230b..0e1ba6986b1 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1884,15 +1884,16 @@ displaced_step_fixup (thread_info *event_thread, enum gdb_signal signal)
   if (displaced->step_thread != event_thread)
     return 0;
 
-  displaced_step_reset_cleanup cleanup (displaced);
-
-  displaced_step_restore (displaced, displaced->step_thread->ptid);
-
   /* Fixup may need to read memory/registers.  Switch to the thread
      that we're fixing up.  Also, target_stopped_by_watchpoint checks
-     the current thread.  */
+     the current thread, and displaced_step_restore performs ptid-dependent
+     memory accesses using current_inferior() and current_top_target().  */
   switch_to_thread (event_thread);
 
+  displaced_step_reset_cleanup cleanup (displaced);
+
+  displaced_step_restore (displaced, displaced->step_thread->ptid);
+
   /* Did the instruction complete successfully?  */
   if (signal == GDB_SIGNAL_TRAP
       && !(target_stopped_by_watchpoint ()
diff --git a/gdb/testsuite/gdb.multi/run-only-second-inf.c b/gdb/testsuite/gdb.multi/run-only-second-inf.c
new file mode 100644
index 00000000000..f4825c8a7c1
--- /dev/null
+++ b/gdb/testsuite/gdb.multi/run-only-second-inf.c
@@ -0,0 +1,22 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.multi/run-only-second-inf.exp b/gdb/testsuite/gdb.multi/run-only-second-inf.exp
new file mode 100644
index 00000000000..874cdcd13e9
--- /dev/null
+++ b/gdb/testsuite/gdb.multi/run-only-second-inf.exp
@@ -0,0 +1,49 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Create two inferiors where the first one is not running.  Then run the
+# second one.  Expect it to start normally.
+
+standard_testfile
+
+if {[use_gdb_stub]} {
+    return 0
+}
+
+proc default_gdb_start_post_cmd { } {
+    # This setting revealed a bug where the context
+    # was not being switched before making ptid-dependent
+    # memory access.
+    gdb_test_no_output "maint set target-non-stop on"
+}
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug}]} {
+    return -1
+}
+
+# Add and start the second inferior.
+gdb_test "add-inferior" "Added inferior 2.*" \
+    "add empty inferior 2"
+gdb_test "inferior 2" "Switching to inferior 2.*" \
+    "switch to inferior 2"
+gdb_load $binfile
+
+if {[gdb_start_cmd] < 0} {
+    fail "start the second inf"
+} else {
+    gdb_test "" ".*reakpoint ., main .*${srcfile}.*" "start the second inf"
+}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore'
  2020-04-20 16:24 ` [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore' Tankut Baris Aktemur
@ 2020-04-21 14:38   ` Pedro Alves
  2020-04-21 15:29     ` Aktemur, Tankut Baris
  0 siblings, 1 reply; 5+ messages in thread
From: Pedro Alves @ 2020-04-21 14:38 UTC (permalink / raw)
  To: Tankut Baris Aktemur, gdb-patches

On 4/20/20 5:24 PM, Tankut Baris Aktemur via Gdb-patches wrote:

> gdb/ChangeLog:
> 2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> 
> 	* infrun.c (displaced_step_fixup): Switch to the event_thread
> 	before calling displaced_step_restore, not after.

Thanks.  This part looks good to me.

> 
> gdb/testsuite/ChangeLog:
> 2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> 
> 	* gdb.multi/run-only-second-inf.c: New file.
> 	* gdb.multi/run-only-second-inf.exp: New file.

Some comments on the testcase below.


> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +# Create two inferiors where the first one is not running.  Then run the
> +# second one.  

If you create two inferiors, and the first one is not running and _then_
you run the second one, then it means that the second one wasn't 
running either.  Seems like some minor rephrasing here could help.

> +
> +standard_testfile
> +
> +if {[use_gdb_stub]} {
> +    return 0
> +}
> +
> +proc default_gdb_start_post_cmd { } {
> +    # This setting revealed a bug where the context
> +    # was not being switched before making ptid-dependent
> +    # memory access.
> +    gdb_test_no_output "maint set target-non-stop on"
> +}

Sorry, but I don't really like this -- the problem is that
it's not guaranteed that each testcase runs on its own
expect/runtest instance, and thus this default_gdb_start_post_cmd
procedure can leak to other testcases.

A number of non-stop tests have a similar issue, which
is resolved by starting GDB with '-ex "set non-stop on"'.
For example, see gdb.threads/non-ldr-exc-2.exp.

I think doing the same here should work.  Something like:

        save_vars { GDBFLAGS } {
          append GDBFLAGS " -ex \"maint set target-non-stop on\""
          clean_restart ${executable}
        }

Otherwise this LGTM.

Thanks,
Pedro Alves


^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore'
  2020-04-21 14:38   ` Pedro Alves
@ 2020-04-21 15:29     ` Aktemur, Tankut Baris
  0 siblings, 0 replies; 5+ messages in thread
From: Aktemur, Tankut Baris @ 2020-04-21 15:29 UTC (permalink / raw)
  To: Pedro Alves, gdb-patches

On Tuesday, April 21, 2020 4:38 PM, Pedro Alves wrote:
> On 4/20/20 5:24 PM, Tankut Baris Aktemur via Gdb-patches wrote:
> 
> > gdb/ChangeLog:
> > 2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> >
> > 	* infrun.c (displaced_step_fixup): Switch to the event_thread
> > 	before calling displaced_step_restore, not after.
> 
> Thanks.  This part looks good to me.
> 
> >
> > gdb/testsuite/ChangeLog:
> > 2020-04-20  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
> >
> > 	* gdb.multi/run-only-second-inf.c: New file.
> > 	* gdb.multi/run-only-second-inf.exp: New file.
> 
> Some comments on the testcase below.
> 
> 
> > +# You should have received a copy of the GNU General Public License
> > +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> > +
> > +# Create two inferiors where the first one is not running.  Then run the
> > +# second one.
> 
> If you create two inferiors, and the first one is not running and _then_
> you run the second one, then it means that the second one wasn't
> running either.  Seems like some minor rephrasing here could help.
> 
> > +
> > +standard_testfile
> > +
> > +if {[use_gdb_stub]} {
> > +    return 0
> > +}
> > +
> > +proc default_gdb_start_post_cmd { } {
> > +    # This setting revealed a bug where the context
> > +    # was not being switched before making ptid-dependent
> > +    # memory access.
> > +    gdb_test_no_output "maint set target-non-stop on"
> > +}
> 
> Sorry, but I don't really like this -- the problem is that
> it's not guaranteed that each testcase runs on its own
> expect/runtest instance, and thus this default_gdb_start_post_cmd
> procedure can leak to other testcases.

Hmm, that would certainly not be desirable.

> A number of non-stop tests have a similar issue, which
> is resolved by starting GDB with '-ex "set non-stop on"'.
> For example, see gdb.threads/non-ldr-exc-2.exp.
> 
> I think doing the same here should work.  Something like:
> 
>         save_vars { GDBFLAGS } {
>           append GDBFLAGS " -ex \"maint set target-non-stop on\""
>           clean_restart ${executable}
>         }

Thanks for the hint.  I discarded the first patch, updated the second per
your comments, and pushed.

> Otherwise this LGTM.
> 
> Thanks,
> Pedro Alves

Regards.
-Baris


Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Gary Kershaw
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-04-21 15:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-20 16:24 [PATCH 0/2] Context-switch in finish-step-over flow Tankut Baris Aktemur
2020-04-20 16:24 ` [PATCH 1/2] testsuite: introduce 'default_gdb_start_post_cmd' as an overridable function Tankut Baris Aktemur
2020-04-20 16:24 ` [PATCH 2/2] gdb/infrun: switch the context before 'displaced_step_restore' Tankut Baris Aktemur
2020-04-21 14:38   ` Pedro Alves
2020-04-21 15:29     ` Aktemur, Tankut Baris

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).