[6/6] gdb: convert the 'start' breakpoint to use inferior keyword

Message ID a7fd9758622d4adaba32c4c47f3dd22a8b4400af.1669634536.git.aburgess@redhat.com
State New
Headers
Series Inferior specific breakpoints |

Commit Message

Andrew Burgess Nov. 28, 2022, 11:25 a.m. UTC
  Now that we have support for inferior specific breakpoints, the
breakpoint created for the 'start' command can make use of this
keyword.

In most cases the observed functionality should be unchanged from a
user's point of view, though the code in GDB is a little cleaner now,
we no longer need to change the expression used based on the
language.

I do wonder if the current mechanism could run into problems if we had
different inferiors of different languages.  For example, if we had an
Ada inferior and a C inferior and followed a process a little like
this:

  1. Start C inferior, the inferior stops before main for some reason,

  2. Start the Ada inferior, this runs to main,

  3. I think when we hit main, the condition for both breakpoints will
  be evaluated, this will include evaluating the expression for the C
  'start' breakpoint, which uses '==' and is, I guess, not valid for
  Ada.

I haven't tried to create a testcase for this situation, but it's a
possibly interesting edge case.

One place where the observed behaviour is different, is that inferior
breakpoints, like thread breakpoints, will be auto-deleted when the
contained inferior exits.

As a result, if an inferior exits before hitting the start breakpoint,
then the 'start' breakpoint will be auto-deleted.

I have got a test that covers this situation.
---
 gdb/infcmd.c                                  | 10 +---
 .../gdb.base/start-inferior-specific-1.c      | 32 +++++++++++
 .../gdb.base/start-inferior-specific-2.c      | 22 ++++++++
 .../gdb.base/start-inferior-specific.exp      | 55 +++++++++++++++++++
 4 files changed, 112 insertions(+), 7 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/start-inferior-specific-1.c
 create mode 100644 gdb/testsuite/gdb.base/start-inferior-specific-2.c
 create mode 100644 gdb/testsuite/gdb.base/start-inferior-specific.exp
  

Comments

Terekhov, Mikhail via Gdb-patches Dec. 23, 2022, 10:17 a.m. UTC | #1
On Monday, November 28, 2022 12:26 PM, Andrew Burgess wrote:
> Now that we have support for inferior specific breakpoints, the
> breakpoint created for the 'start' command can make use of this
> keyword.
...
> diff --git a/gdb/testsuite/gdb.base/start-inferior-specific.exp
> b/gdb/testsuite/gdb.base/start-inferior-specific.exp
> new file mode 100644
> index 00000000000..50e4e109116
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/start-inferior-specific.exp
> @@ -0,0 +1,55 @@
> +# Copyright 2022 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/>.
> +
> +# Check that a breakpoint created for the 'start' command, will be
> +# silently deleted if the inferior being started exits before reaching
> +# main.
> +
> +standard_testfile -1.c -2.c
> +
> +if {[use_gdb_stub]} {
> +    return
> +}
> +
> +set srcfile1 ${srcfile}
> +
> +set binfile1 ${binfile}-1
> +set binfile2 ${binfile}-2
> +
> +if {[build_executable ${testfile}.exp ${binfile1} "${srcfile1}"] != 0} {
> +    return -1
> +}
> +
> +if {[build_executable ${testfile}.exp ${binfile2} "${srcfile2}"] != 0} {
> +    return -1
> +}
> +
> +clean_restart ${binfile1}
> +
> +# Start the first inferior, this will exit before hitting the 'start'
> +# breakpoint in main.
> +gdb_test "start" \
> +    [multi_line \
> +	 "Temporary breakpoint $decimal at \[^\r\n\]+" \
> +	 "Starting program: \[^\r\n\]+" \
> +	 "\\\[Inferior $decimal \[^\r\n\]+ exited with code 01\\\]"]

Can $inferior_exited_re be used here?

> +
> +# Now load a different binary and run it.  This inferior should run
> +# all the way to completion without hitting a breakpoint in main.
> +gdb_load ${binfile2}
> +gdb_test "run" \
> +    [multi_line \
> +	 "Starting program: \[^\r\n\]+" \
> +	 "\\\[Inferior $decimal \[^\r\n\]+ exited normally\\\]"]

Also here.

Thanks
-Baris

Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva  
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
  

Patch

diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index f7bce0d0399..7aa9a959bdb 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -429,13 +429,9 @@  run_command_1 (const char *args, int from_tty, enum run_how run_how)
 	 have proper inferior-specific breakpoint support, in the breakpoint
 	 machinery.  We could then avoid inserting a breakpoint in the program
 	 spaces unrelated to this inferior.  */
-      const char *op
-	= ((current_language->la_language == language_ada
-	    || current_language->la_language == language_pascal
-	    || current_language->la_language == language_m2) ? "=" : "==");
-      std::string arg = string_printf
-	("-qualified %s if $_inferior %s %d", main_name (), op,
-	 current_inferior ()->num);
+      std::string arg = string_printf ("-qualified %s inferior %d",
+				       main_name (),
+				       current_inferior ()->num);
       tbreak_command (arg.c_str (), 0);
     }
 
diff --git a/gdb/testsuite/gdb.base/start-inferior-specific-1.c b/gdb/testsuite/gdb.base/start-inferior-specific-1.c
new file mode 100644
index 00000000000..1717a82b75d
--- /dev/null
+++ b/gdb/testsuite/gdb.base/start-inferior-specific-1.c
@@ -0,0 +1,32 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2022 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/>.  */
+
+#include <unistd.h>
+#include <stdlib.h>
+
+__attribute__((constructor))
+static void
+ctor (void)
+{
+  exit (1);
+}
+
+int
+main ()
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/start-inferior-specific-2.c b/gdb/testsuite/gdb.base/start-inferior-specific-2.c
new file mode 100644
index 00000000000..b69e218962a
--- /dev/null
+++ b/gdb/testsuite/gdb.base/start-inferior-specific-2.c
@@ -0,0 +1,22 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2022 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.base/start-inferior-specific.exp b/gdb/testsuite/gdb.base/start-inferior-specific.exp
new file mode 100644
index 00000000000..50e4e109116
--- /dev/null
+++ b/gdb/testsuite/gdb.base/start-inferior-specific.exp
@@ -0,0 +1,55 @@ 
+# Copyright 2022 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/>.
+
+# Check that a breakpoint created for the 'start' command, will be
+# silently deleted if the inferior being started exits before reaching
+# main.
+
+standard_testfile -1.c -2.c
+
+if {[use_gdb_stub]} {
+    return
+}
+
+set srcfile1 ${srcfile}
+
+set binfile1 ${binfile}-1
+set binfile2 ${binfile}-2
+
+if {[build_executable ${testfile}.exp ${binfile1} "${srcfile1}"] != 0} {
+    return -1
+}
+
+if {[build_executable ${testfile}.exp ${binfile2} "${srcfile2}"] != 0} {
+    return -1
+}
+
+clean_restart ${binfile1}
+
+# Start the first inferior, this will exit before hitting the 'start'
+# breakpoint in main.
+gdb_test "start" \
+    [multi_line \
+	 "Temporary breakpoint $decimal at \[^\r\n\]+" \
+	 "Starting program: \[^\r\n\]+" \
+	 "\\\[Inferior $decimal \[^\r\n\]+ exited with code 01\\\]"]
+
+# Now load a different binary and run it.  This inferior should run
+# all the way to completion without hitting a breakpoint in main.
+gdb_load ${binfile2}
+gdb_test "run" \
+    [multi_line \
+	 "Starting program: \[^\r\n\]+" \
+	 "\\\[Inferior $decimal \[^\r\n\]+ exited normally\\\]"]