diff options
author | Pedro Alves <palves@redhat.com> | 2020-01-10 20:06:14 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2020-01-10 20:06:14 +0000 |
commit | 121b3efd49f98e4049281b3ba7a258e650e40b38 (patch) | |
tree | 6cc76edd8054a1270597adc9fa668562eba78d82 /gdb/target-connection.c | |
parent | 4f83758119ddf0f114477760d79bdde7bbc76835 (diff) | |
download | binutils-121b3efd49f98e4049281b3ba7a258e650e40b38.zip binutils-121b3efd49f98e4049281b3ba7a258e650e40b38.tar.gz binutils-121b3efd49f98e4049281b3ba7a258e650e40b38.tar.bz2 |
Add "info connections" command, "info inferiors" connection number/string
This commit extends the CLI a bit for multi-target, in three ways.
#1 - New "info connections" command.
This is a new command that lists the open connections (process_stratum
targets). For example, if you're debugging two remote connections, a
couple local/native processes, and a core dump, all at the same time,
you might see something like this:
(gdb) info connections
Num What Description
1 remote 192.168.0.1:9999 Remote serial target in gdb-specific protocol
2 remote 192.168.0.2:9998 Remote serial target in gdb-specific protocol
* 3 native Native process
4 core Local core dump file
#2 - New "info inferiors" "Connection" column
You'll also see a new matching "Connection" column in "info
inferiors", showing you which connection an inferior is bound to:
(gdb) info inferiors
Num Description Connection Executable
1 process 18526 1 (remote 192.168.0.1:9999) target:/tmp/a.out
2 process 18531 2 (remote 192.168.0.2:9998) target:/tmp/a.out
3 process 19115 3 (native) /tmp/prog1
4 process 6286 4 (core) myprogram
* 5 process 19122 3 (native) /bin/hello
#3 - Makes "add-inferior" show the inferior's target connection
"add-inferior" now shows you the connection you've just bound the
inferior to, which is the current process_stratum target:
(gdb) add-inferior
[New inferior 2]
Added inferior 2 on connection 1 (extended-remote localhost:2346)
gdb/ChangeLog:
2020-01-10 Pedro Alves <palves@redhat.com>
* Makefile.in (COMMON_SFILES): Add target-connection.c.
* inferior.c (uiout_field_connection): New function.
(print_inferior): Add new "connection-id" column.
(add_inferior_command): Show connection number/string of added
inferior.
* process-stratum-target.h
(process_stratum_target::connection_string): New virtual method.
(process_stratum_target::connection_number): New field.
* remote.c (remote_target::connection_string): New override.
* target-connection.c: New file.
* target-connection.h: New file.
* target.c (decref_target): Remove process_stratum targets from
the connection list.
(target_stack::push): Add process_stratum targets to the
connection list.
gdb/testsuite/ChangeLog:
2020-01-10 Pedro Alves <palves@redhat.com>
* gdb.base/kill-detach-inferiors-cmd.exp: Adjust expected output
of "add-inferior".
* gdb.base/quit-live.exp: Likewise.
* gdb.base/remote-exec-file.exp: Likewise.
* gdb.guile/scm-progspace.exp: Likewise.
* gdb.linespec/linespec.exp: Likewise.
* gdb.mi/new-ui-mi-sync.exp: Likewise.
* gdb.mi/user-selected-context-sync.exp: Likewise.
* gdb.multi/multi-target.exp (setup): Add "info connection" and
"info inferiors" tests.
* gdb.multi/remove-inferiors.exp: Adjust expected output of
"add-inferior".
* gdb.multi/watchpoint-multi.exp: Likewise.
* gdb.python/py-inferior.exp: Likewise.
* gdb.server/extended-remote-restart.exp: Likewise.
* gdb.threads/fork-plus-threads.exp: Adjust expected output of
"info inferiors".
* gdb.threads/forking-threads-plus-breakpoint.exp: Likewise.
* gdb.trace/report.exp: Likewise.
Diffstat (limited to 'gdb/target-connection.c')
-rw-r--r-- | gdb/target-connection.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/gdb/target-connection.c b/gdb/target-connection.c new file mode 100644 index 0000000..35c786b --- /dev/null +++ b/gdb/target-connection.c @@ -0,0 +1,162 @@ +/* List of target connections for GDB. + + Copyright (C) 2017-2020 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 "defs.h" +#include "target-connection.h" + +#include <map> + +#include "inferior.h" +#include "target.h" + +/* A map between connection number and representative process_stratum + target. */ +static std::map<int, process_stratum_target *> process_targets; + +/* The highest connection number ever given to a target. */ +static int highest_target_connection_num; + +/* See target-connection.h. */ + +void +connection_list_add (process_stratum_target *t) +{ + if (t->connection_number == 0) + { + t->connection_number = ++highest_target_connection_num; + process_targets[t->connection_number] = t; + } +} + +/* See target-connection.h. */ + +void +connection_list_remove (process_stratum_target *t) +{ + process_targets.erase (t->connection_number); + t->connection_number = 0; +} + +/* Make a target connection string for T. This is usually T's + shortname, but it includes the result of + process_stratum_target::connection_string() too if T supports + it. */ + +static std::string +make_target_connection_string (process_stratum_target *t) +{ + if (t->connection_string () != NULL) + return string_printf ("%s %s", t->shortname (), + t->connection_string ()); + else + return t->shortname (); +} + +/* Prints the list of target connections and their details on UIOUT. + + If REQUESTED_CONNECTIONS is not NULL, it's a list of GDB ids of the + target connections that should be printed. Otherwise, all target + connections are printed. */ + +static void +print_connection (struct ui_out *uiout, const char *requested_connections) +{ + int count = 0; + size_t what_len = 0; + + /* Compute number of lines we will print. */ + for (const auto &it : process_targets) + { + if (!number_is_in_list (requested_connections, it.first)) + continue; + + ++count; + + process_stratum_target *t = it.second; + + size_t l = strlen (t->shortname ()); + if (t->connection_string () != NULL) + l += 1 + strlen (t->connection_string ()); + + if (l > what_len) + what_len = l; + } + + if (count == 0) + { + uiout->message (_("No connections.\n")); + return; + } + + ui_out_emit_table table_emitter (uiout, 4, process_targets.size (), + "connections"); + + uiout->table_header (1, ui_left, "current", ""); + uiout->table_header (4, ui_left, "number", "Num"); + /* The text in the "what" column may include spaces. Add one extra + space to visually separate the What and Description columns a + little better. Compare: + "* 1 remote :9999 Remote serial target in gdb-specific protocol" + "* 1 remote :9999 Remote serial target in gdb-specific protocol" + */ + uiout->table_header (what_len + 1, ui_left, "what", "What"); + uiout->table_header (17, ui_left, "description", "Description"); + + uiout->table_body (); + + for (const auto &it : process_targets) + { + process_stratum_target *t = it.second; + + if (!number_is_in_list (requested_connections, t->connection_number)) + continue; + + ui_out_emit_tuple tuple_emitter (uiout, NULL); + + if (current_inferior ()->process_target () == t) + uiout->field_string ("current", "*"); + else + uiout->field_skip ("current"); + + uiout->field_signed ("number", t->connection_number); + + uiout->field_string ("what", make_target_connection_string (t).c_str ()); + + uiout->field_string ("description", t->longname ()); + + uiout->text ("\n"); + } +} + +/* The "info connections" command. */ + +static void +info_connections_command (const char *args, int from_tty) +{ + print_connection (current_uiout, args); +} + +void +_initialize_target_connection () +{ + add_info ("connections", info_connections_command, + _("\ +Target connections in use.\n\ +Shows the list of target connections currently in use.")); +} |