aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-03-02 11:11:47 +0000
committerAndrew Burgess <aburgess@redhat.com>2022-03-07 19:39:04 +0000
commit6fd90137e776c1a29f75651af8e7a129337254c7 (patch)
treecb2fa47236787daaef73d74ce4073399aace6e69
parentd43bd54d543742c76fb20a0fe379817ccca4e5f2 (diff)
downloadgdb-6fd90137e776c1a29f75651af8e7a129337254c7.zip
gdb-6fd90137e776c1a29f75651af8e7a129337254c7.tar.gz
gdb-6fd90137e776c1a29f75651af8e7a129337254c7.tar.bz2
gdb/mi: add --no-connection to MI -add-inferior command
Following on from the previous commit, where the -add-inferior command now uses the same connection as the current inferior, this commit adds a --no-connection option to -add-inferior. This new option matches the existing option of the same name for the CLI version of add-inferior; the new inferior is created with no connection. I've added a new 'connection' field to the MI output of -add-inferior, which includes the connection number and short name. I haven't included the longer description field, this is the MI after all. My expectation would be that if the frontend wanted to display all the connection details then this would be looked up from 'info connection' (or the MI equivalent if/when such a command is added). The existing -add-inferior tests are updated, as are the docs.
-rw-r--r--gdb/NEWS4
-rw-r--r--gdb/doc/gdb.texinfo39
-rw-r--r--gdb/mi/mi-main.c45
-rw-r--r--gdb/testsuite/gdb.mi/interrupt-thread-group.exp16
-rw-r--r--gdb/testsuite/gdb.mi/mi-add-inferior.exp10
5 files changed, 91 insertions, 23 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index 4e12ebf..e0c55e8 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -158,6 +158,10 @@ info win
connection of the current inferior, this restores the behaviour of
GDB as it was prior to GDB 10.
+ ** The '-add-inferior' command now accepts a '--no-connection'
+ option, which causes the new inferior to start without a
+ connection.
+
* New targets
GNU/Linux/LoongArch loongarch*-*-linux*
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 063e3a1..132b94c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -3310,6 +3310,7 @@ remove inferiors from the debugging session use the
@w{@code{remove-inferiors}} command.
@table @code
+@anchor{add_inferior_cli}
@kindex add-inferior
@item add-inferior [ -copies @var{n} ] [ -exec @var{executable} ] [-no-connection ]
Adds @var{n} inferiors to be run using @var{executable} as the
@@ -37141,15 +37142,45 @@ popup menu, but is needless clutter on the command line, and
@subheading Synopsis
@smallexample
--add-inferior
+-add-inferior [ --no-connection ]
@end smallexample
Creates a new inferior (@pxref{Inferiors Connections and Programs}). The created
inferior is not associated with any executable. Such association may
be established with the @samp{-file-exec-and-symbols} command
-(@pxref{GDB/MI File Commands}). The command response has a single
-field, @samp{inferior}, whose value is the identifier of the
-thread group corresponding to the new inferior.
+(@pxref{GDB/MI File Commands}).
+
+By default, the new inferior begins connected to the same target
+connection as the current inferior. For example, if the current
+inferior was connected to @code{gdbserver} with @code{target remote},
+then the new inferior will be connected to the same @code{gdbserver}
+instance. The @samp{--no-connection} option starts the new inferior
+with no connection yet. You can then for example use the
+@code{-target-select remote} command to connect to some other
+@code{gdbserver} instance, use @code{-exec-run} to spawn a local
+program, etc.
+
+The command response always has a field, @var{inferior}, whose value
+is the identifier of the thread group corresponding to the new
+inferior.
+
+An additional section field, @var{connection}, is optional. This
+field will only exist if the new inferior has a target connection. If
+this field exists, then its value will be a tuple containing the
+following fields:
+
+@table @samp
+@item number
+The number of the connection used for the new inferior.
+
+@item name
+The name of the connection type used for the new inferior.
+@end table
+
+@subheading @value{GDBN} Command
+
+The corresponding @value{GDBN} command is @samp{add-inferior}
+(@pxref{add_inferior_cli,,@samp{add-inferior}}).
@subheading Example
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index 2fab592..b359296 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -1703,18 +1703,53 @@ mi_cmd_list_target_features (const char *command, char **argv, int argc)
void
mi_cmd_add_inferior (const char *command, char **argv, int argc)
{
- struct inferior *inf;
+ bool no_connection = false;
- if (argc != 0)
- error (_("-add-inferior should be passed no arguments"));
+ /* Parse the command options. */
+ enum opt
+ {
+ NO_CONNECTION_OPT,
+ };
+ static const struct mi_opt opts[] =
+ {
+ {"-no-connection", NO_CONNECTION_OPT, 0},
+ {NULL, 0, 0},
+ };
+
+ int oind = 0;
+ char *oarg;
+
+ while (1)
+ {
+ int opt = mi_getopt ("-add-inferior", argc, argv, opts, &oind, &oarg);
+
+ if (opt < 0)
+ break;
+ switch ((enum opt) opt)
+ {
+ case NO_CONNECTION_OPT:
+ no_connection = true;
+ break;
+ }
+ }
scoped_restore_current_pspace_and_thread restore_pspace_thread;
- inf = add_inferior_with_spaces ();
+ inferior *inf = add_inferior_with_spaces ();
- switch_to_inferior_and_push_target (inf, false, current_inferior ());
+ switch_to_inferior_and_push_target (inf, no_connection,
+ current_inferior ());
current_uiout->field_fmt ("inferior", "i%d", inf->num);
+
+ process_stratum_target *proc_target = inf->process_target ();
+
+ if (proc_target != nullptr)
+ {
+ ui_out_emit_tuple tuple_emitter (current_uiout, "connection");
+ current_uiout->field_unsigned ("number", proc_target->connection_number);
+ current_uiout->field_string ("name", proc_target->shortname ());
+ }
}
void
diff --git a/gdb/testsuite/gdb.mi/interrupt-thread-group.exp b/gdb/testsuite/gdb.mi/interrupt-thread-group.exp
index 8661d57..19ccbe8 100644
--- a/gdb/testsuite/gdb.mi/interrupt-thread-group.exp
+++ b/gdb/testsuite/gdb.mi/interrupt-thread-group.exp
@@ -57,19 +57,9 @@ mi_send_resuming_command "exec-continue --thread-group i1" \
set use_second_inferior [expr {![use_gdb_stub]}]
if { $use_second_inferior } {
- # The inferior created by the -add-inferior MI command does not inherit the
- # target connection of the first inferior. If debugging through an
- # extended-remote connection, that means we can't run that second inferior
- # on the remote connection. Use the add-inferior CLI command as a stop-gap.
- if { [mi_is_target_remote] } {
- mi_gdb_test "add-inferior" \
- "\\^done" \
- "add inferior 2"
- } else {
- mi_gdb_test "-add-inferior" \
- "\\^done,inferior=\"i2\"" \
- "add inferior 2"
- }
+ mi_gdb_test "-add-inferior" \
+ "\\^done,inferior=\"i2\",connection=\\{\[^\}\]+\\}" \
+ "add inferior 2"
mi_gdb_test "-file-exec-and-symbols --thread-group i2 $::binfile" \
"\\^done" \
"set executable of inferior 2"
diff --git a/gdb/testsuite/gdb.mi/mi-add-inferior.exp b/gdb/testsuite/gdb.mi/mi-add-inferior.exp
index 3f0cd7c..85cd6a5 100644
--- a/gdb/testsuite/gdb.mi/mi-add-inferior.exp
+++ b/gdb/testsuite/gdb.mi/mi-add-inferior.exp
@@ -79,7 +79,7 @@ mi_gdb_test "-add-inferior" \
[multi_line "=thread-group-added,id=\"\[^\"\]+\"" \
"~\"\\\[New inferior 2\\\]\\\\n\"" \
"\~\"Added inferior 2 on connection ${conn_pattern}\\\\n\"" \
- "\\^done,inferior=\"\[^\"\]+\"" ] \
+ "\\^done,inferior=\"\[^\"\]+\",connection=\{number=\"$decimal\",name=\"\[^\"\]+\"\}" ] \
"mi add inferior"
# Now run 'info inferiors' again to check that the currently selected
@@ -120,3 +120,11 @@ gdb_test_multiple "info inferiors" \
pass $gdb_test_name
}
}
+
+# Add a third inferior, but this time, use --no-connection.
+mi_gdb_test "-add-inferior --no-connection" \
+ [multi_line "=thread-group-added,id=\"\[^\"\]+\"" \
+ "~\"\\\[New inferior 3\\\]\\\\n\"" \
+ "\~\"Added inferior 3\\\\n\"" \
+ "\\^done,inferior=\"\[^\"\]+\"" ] \
+ "mi add inferior with no connection"