Re: [PATCH v4] inferior without argument prints detail of current inferior

Lancelot SIX via Gdb-patches
2021-02-02T22:44:54Z

Hi,

I have pushed this patch.

I’d like to update https://sourceware.org/gdb/wiki/ProjectIdeas. To do
so, I need to be in the EditorGroup. Can a member of the group update
the page or grant me access?

Thanks,
Lancelot.

Le Sun, Jan 10, 2021 at 05:58:24PM +0000, Lancelot SIX a écrit :
> This patch makes the inferior command display information about the
> current inferior when called with no argument. This behavior is similar
> to the one of the thread command.
>
> This contribution is inspired by an item in
> https://sourceware.org/gdb/wiki/ProjectIdeas
>
> Before patch:
>
> (gdb) info inferior
> Num Description Connection Executable
> * 1 process 19221 1 (native) /home/lsix/tmp/a.out
> 2 process 19239 1 (native) /home/lsix/tmp/a.out
> (gdb) inferior 2
> [Switching to inferior 2 [process 19239] (/home/lsix/tmp/a.out)]
> [Switching to thread 2.1 (process 19239)]
> #0 0x0000000000401146 in main ()
> (gdb) inferior
> Argument required (expression to compute).
>
> After patch:
>
> (gdb) info inferior
> Num Description Connection Executable
> * 1 process 18699 1 (native) /home/lsix/tmp/a.out
> 2 process 18705 1 (native) /home/lsix/tmp/a.out
> (gdb) inferior 2
> [Switching to inferior 2 [process 18705] (/home/lsix/tmp/a.out)]
> [Switching to thread 2.1 (process 18705)]
> #0 0x0000000000401146 in main ()
> (gdb) inferior
> [Current inferior is 2 [process 18705] (/home/lsix/tmp/a.out)]
>
> Changes from V1:
> * Add test.
>
> Change from V2:
> * Fix gdb/doc/ChangeLog entry.
>
> Change from V3:
> * Add entry in the NEWS file.
> * Improve inferior-noarg.expr and remove assumptions particular
> format in pid_to_str.
> * Fix copyright year in new files.
>
> gdb/doc/ChangeLog:
>
> * gdb.texinfo (Inferiors Connections and Programs): Document the
> inferior command when used without argument.
>
> gdb/ChangeLog:
>
> * NEWS: Add entry for the behavior change of the inferior command.
> * inferior.c (inferior_command): When no argument is given to the
> inferior command, display info about the currently selected
> inferior.
>
> gdb/testsuite/ChangeLog:
>
> * gdb.base/inferior-noarg.c: New test.
> * gdb.base/inferior-noarg.exp: New test.
>
> ---
> ---
> gdb/NEWS | 6 +++
> gdb/doc/gdb.texinfo | 16 +++++++
> gdb/inferior.c | 58 +++++++++++++++--------
> gdb/testsuite/gdb.base/inferior-noarg.c | 22 +++++++++
> gdb/testsuite/gdb.base/inferior-noarg.exp | 36 ++++++++++++++
> 5 files changed, 117 insertions(+), 21 deletions(-)
> create mode 100644 gdb/testsuite/gdb.base/inferior-noarg.c
> create mode 100644 gdb/testsuite/gdb.base/inferior-noarg.exp
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 66702862ef..d9788f6733 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -75,6 +75,12 @@ maintenance flush-symbol-cache
> 'maintenance flush register-cache' and 'maintenance flush
> symbol-cache' respectively.
>
> +inferior [ID]
> + When the ID parameter is omitted, then this command prints information
> + about the current inferior. When the ID parameter is present, the
> + behavior of the command is unchanged and have the inferior ID become
> + the current inferior.
> +
> *** Changes in GDB 10
>
> * There are new feature names for ARC targets: "org.gnu.gdb.arc.core"
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 69fa6b709b..a97a342e9d 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -3202,6 +3202,22 @@ For example,
> 2 process 2307 2 (extended-remote host:10000) hello
> @end smallexample
>
> +To get informations about the current inferior, use @code{inferior}:
> +
> +@table @code
> +@kindex inferior
> +@item inferior
> +Shows information about the current inferior.
> +
> +For example,
> +@end table
> +@c end table here to get a little more width for example
> +
> +@smallexample
> +(@value{GDBP}) inferior
> +[Current inferior is 1 [process 3401] (helloworld)]
> +@end smallexample
> +
> To find out what open target connections exist at any moment, use
> @w{@code{info connections}}:
>
> diff --git a/gdb/inferior.c b/gdb/inferior.c
> index 3ff0512c38..49f869a4c7 100644
> --- a/gdb/inferior.c
> +++ b/gdb/inferior.c
> @@ -635,34 +635,50 @@ inferior_command (const char *args, int from_tty)
> struct inferior *inf;
> int num;
>
> - num = parse_and_eval_long (args);
> -
> - inf = find_inferior_id (num);
> - if (inf == NULL)
> - error (_("Inferior ID %d not known."), num);
> -
> - if (inf->pid != 0)
> + if (args == nullptr)
> {
> - if (inf != current_inferior ())
> - {
> - thread_info *tp = any_thread_of_inferior (inf);
> - if (tp == NULL)
> - error (_("Inferior has no threads."));
> + inf = current_inferior ();
> + gdb_assert (inf != nullptr);
> + const char *filename = inf->pspace->exec_filename.get ();
>
> - switch_to_thread (tp);
> - }
> + if (filename == nullptr)
> + filename = _("<noexec>");
>
> - gdb::observers::user_selected_context_changed.notify
> - (USER_SELECTED_INFERIOR
> - | USER_SELECTED_THREAD
> - | USER_SELECTED_FRAME);
> + printf_filtered (_("[Current inferior is %d [%s] (%s)]\n"),
> + inf->num, inferior_pid_to_str (inf->pid).c_str (),
> + filename);
> }
> else
> {
> - switch_to_inferior_no_thread (inf);
> + num = parse_and_eval_long (args);
> +
> + inf = find_inferior_id (num);
> + if (inf == NULL)
> + error (_("Inferior ID %d not known."), num);
> +
> + if (inf->pid != 0)
> + {
> + if (inf != current_inferior ())
> + {
> + thread_info *tp = any_thread_of_inferior (inf);
> + if (tp == NULL)
> + error (_("Inferior has no threads."));
>
> - gdb::observers::user_selected_context_changed.notify
> - (USER_SELECTED_INFERIOR);
> + switch_to_thread (tp);
> + }
> +
> + gdb::observers::user_selected_context_changed.notify
> + (USER_SELECTED_INFERIOR
> + | USER_SELECTED_THREAD
> + | USER_SELECTED_FRAME);
> + }
> + else
> + {
> + switch_to_inferior_no_thread (inf);
> +
> + gdb::observers::user_selected_context_changed.notify
> + (USER_SELECTED_INFERIOR);
> + }
> }
> }
>
> diff --git a/gdb/testsuite/gdb.base/inferior-noarg.c b/gdb/testsuite/gdb.base/inferior-noarg.c
> new file mode 100644
> index 0000000000..bfe52c018d
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/inferior-noarg.c
> @@ -0,0 +1,22 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> + Copyright 2021 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 (void)
> +{
> + return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/inferior-noarg.exp b/gdb/testsuite/gdb.base/inferior-noarg.exp
> new file mode 100644
> index 0000000000..65d23fe46e
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/inferior-noarg.exp
> @@ -0,0 +1,36 @@
> +# Copyright 2021 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/>.
> +
> +# This test case checks that the 'inferior' command, when given no
> +# argument, displays information about the inferior currently active.
> +
> +standard_testfile
> +
> +if { [prepare_for_testing "failed to prepare" \
> + ${testfile} ${srcfile}] } {
> + return
> +}
> +
> +gdb_test "inferior" "\[Current inferior is 1 \[<null>\] (.*)\]" "inferior not running"
> +
> +if { ![runto_main] } {
> + untested "could not run to main"
> + return
> +}
> +
> +gdb_test "inferior" {\[Current inferior is 1 \[.*\] (.*)\]} "inferior running"
> +gdb_test "clone-inferior" "Added inferior 2.*" "create new inferior"
> +gdb_test "inferior 2" "\[Switching to inferior 2 \[<null>\] (.*)]" "change inferior"
> +gdb_test "inferior" "\[Current inferior is 2 \[<null>\] (.*)\]" "show new inferior"
> --
> 2.29.2
>

--
Lancelot SIX