[PATCH v2 3/3] gdb: add the 'set/show suppress-notification-cli' command
Andrew Burgess
aburgess@redhat.com
Wed Feb 2 15:34:57 GMT 2022
* Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> [2022-01-20 12:42:52 +0100]:
> GDB already has a flag to suppress printing notification events, such
> as thread and inferior context switches, on the CLI. This is used
> internally when executing commands. Make the flag available to the
> user via a new command. This is expected to be useful in scripts.
>
> For instance, suppose that when Inferior 1 gets to a certain state,
> you want to add and set up a new inferior using the commands below,
> but you also want to have a reduced/clean output.
>
> define do-setup
> printf "Setting up Inferior 2...\n"
> add-inferior -exec a.out
> inferior 2
> break file.c:3
> run
> inferior 1
> printf "Done\n"
> end
>
> Currently, GDB prints
>
> (gdb) do-setup
> Setting up Inferior 2...
> [New inferior 2]
> Added inferior 2 on connection 1 (native)
> [Switching to inferior 2 [<null>] (/tmp/a.out)]
> Breakpoint 2 at 0x1155: file file.c, line 3.
>
> Thread 2.1 "a.out" hit Breakpoint 2, main () at file.c:3
> 3 return 0;
> [Switching to inferior 1 [process 7670] (/tmp/test)]
> [Switching to thread 1.1 (process 7670)]
> #0 main () at test.c:2
> 2 int a = 1;
> Done
>
> GDB's Python API make it possible to capture and return GDB's output,
> but this does not work for all the streams. In particular, CLI
> notification events are not captured:
>
> (gdb) python gdb.execute("do-setup", False, True)
> [Switching to inferior 2 [<null>] (/tmp/a.out)]
>
> Thread 2.1 "a.out" hit Breakpoint 2, main () at file.c:3
> 3 return 0;
> [Switching to inferior 1 [process 8263] (/tmp/test)]
> [Switching to thread 1.1 (process 8263)]
> #0 main () at test.c:2
> 2 int a = 1;
>
> You can use the new "set suppress-notification-cli" command to
> suppress the output:
>
> (gdb) set suppress-notification-cli on
> (gdb) do-setup
> Setting up Inferior 2...
> [New inferior 2]
> Added inferior 2 on connection 1 (native)
> Breakpoint 2 at 0x1155: file file.c, line 3.
> Done
> ---
> gdb/NEWS | 5 +
> gdb/cli/cli-cmds.c | 35 +++++
> gdb/doc/gdb.texinfo | 121 ++++++++++++++++++
> .../gdb.base/cli-suppress-notification.c | 22 ++++
> .../gdb.base/cli-suppress-notification.exp | 33 +++++
> 5 files changed, 216 insertions(+)
> create mode 100644 gdb/testsuite/gdb.base/cli-suppress-notification.c
> create mode 100644 gdb/testsuite/gdb.base/cli-suppress-notification.exp
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 8c13cefb22f..c679bbbf799 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -81,6 +81,11 @@ maint show gnu-source-highlight enabled
> styling to a particular source file, then the Python Pygments
> library will be used instead.
>
> +set suppress-notification-cli (on|off)
> +show suppress-notification-cli
> + This controls whether printing the notification events is suppressed
> + for CLI.
> +
> * Changed commands
>
> maint packet
> diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
> index e62e7a9331f..18dc0247524 100644
> --- a/gdb/cli/cli-cmds.c
> +++ b/gdb/cli/cli-cmds.c
> @@ -192,6 +192,11 @@ static const char *const script_ext_enums[] = {
>
> static const char *script_ext_mode = script_ext_soft;
>
> +
> +/* User-controllable flag to suppress event notification on CLI. */
> +
> +static bool user_wants_cli_suppress_notification = false;
> +
> /* Utility used everywhere when at least one argument is needed and
> none is supplied. */
>
> @@ -2123,6 +2128,24 @@ show_max_user_call_depth (struct ui_file *file, int from_tty,
> value);
> }
>
> +static void
> +show_suppress_notification_cli (ui_file *file, int from_tty,
> + cmd_list_element *c, const char *value)
This needs a comment, just:
/* Implement 'show suppress-notification-cli'. */
will do.
> +{
> + fprintf_filtered (file, _("Suppression of printing CLI notification events "
> + "is %s.\n"), value);
> +}
> +
> +static void
> +set_suppress_notification_cli (const char *args, int from_tty,
> + cmd_list_element *c)
Like above, but 'set suppress-notification-cli'.
> +{
> + cli_suppress_notification.user_selected_context
> + = user_wants_cli_suppress_notification;
> + cli_suppress_notification.normal_stop
> + = user_wants_cli_suppress_notification;
> +}
> +
> /* Returns the cmd_list_element in SHOWLIST corresponding to the first
> argument of ARGV, which must contain one single value.
> Throws an error if no value provided, or value not correct.
> @@ -2721,6 +2744,18 @@ Make \"wLapPeu\" an alias of 2 nested \"with\":\n\
>
> set_cmd_completer_handle_brkchars (c, alias_command_completer);
>
> + add_setshow_boolean_cmd ("suppress-notification-cli", no_class,
> + &user_wants_cli_suppress_notification,
> + _("\
> +Set whether printing notification events on CLI is suppressed."), _("\
> +Show whether printing notification events on CLI is suppressed."), _("\
> +When on, printing notification events (such as inferior/thread switch)\n\
> +on CLI is suppressed."),
> + set_suppress_notification_cli,
> + show_suppress_notification_cli,
> + &setlist,
> + &showlist);
> +
> const char *source_help_text = xstrprintf (_("\
> Read commands from a file named FILE.\n\
> \n\
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index fe81687a66c..fadde0eec7f 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -27211,6 +27211,127 @@ inside a cygwin window.
> Displays whether the debugger is operating in interactive mode or not.
> @end table
>
> +@table @code
> +@kindex set suppress-notification-cli
> +@item set suppress-notification-cli
> +If @code{on}, command-line-interface (CLI) notification events that
> +are printed by @value{GDBN} are suppressed. If @code{off}, the
> +notification events are printed as usual. The default value is
> +@code{off}. The CLI notification events occur when you change the
> +selected context or when the program being debugged stops, as detailed
> +below.
> +
> +@noindent
> +@emph{User-selected context changes:} When you change the selected
> +context (i.e.@: the current inferior, thread and/or the frame),
> +@value{GDBN} prints information about the new context. For example,
> +the default behavior is below:
> +
> +@smallexample
> +(gdb) inferior 1
> +[Switching to inferior 1 [process 634] (/tmp/test)]
> +[Switching to thread 1 (process 634)]
> +#0 main () at test.c:3
> +3 return 0;
> +(gdb)
> +@end smallexample
> +
> +@noindent
> +When the events are suppressed, the new context is not printed:
> +
> +@smallexample
> +(gdb) set suppress-notification-cli on
> +(gdb) inferior 1
> +(gdb)
> +@end smallexample
> +
> +@noindent
> +@emph{The program being debugged stops:} When the program you are
> +debugging stops (e.g.@: because of hitting a breakpoint, completing
> +source-stepping, an interrupt, etc.), @value{GDBN} prints information
> +about the stop event. For example, below is a breakpoint hit event:
> +
> +@smallexample
> +(gdb) break test.c:3
> +Breakpoint 2 at 0x555555555155: file test.c, line 3.
> +(gdb) continue
> +Continuing.
> +
> +Breakpoint 2, main () at test.c:3
> +3 return 0;
> +(gdb)
> +@end smallexample
> +
> +@noindent
> +When the events are suppressed, the output becomes:
> +
> +@smallexample
> +(gdb) break test.c:3
> +Breakpoint 2 at 0x555555555155: file test.c, line 3.
> +(gdb) set suppress-notification-cli on
> +(gdb) continue
> +Continuing.
> +(gdb)
> +@end smallexample
> +
> +@noindent
> +Suppressing CLI notification events may be useful in scripts to obtain
> +a reduced output from a list of commands. For instance, suppose that
> +you want to add and set up a new inferior using the following
> +commands:
> +
> +@smallexample
> +define do-setup
> + printf "Setting up Inferior 2...\n"
> + add-inferior -exec a.out
> + inferior 2
> + break file.c:3
> + run
> + inferior 1
> + printf "Done\n"
> +end
> +@end smallexample
> +
> +@noindent
> +When the CLI notification events are not suppressed, the output is as
> +follows:
> +
> +@smallexample
> +(gdb) do-setup
> +Setting up Inferior 2...
> +[New inferior 2]
> +Added inferior 2 on connection 1 (native)
> +[Switching to inferior 2 [<null>] (/tmp/a.out)]
> +Breakpoint 2 at 0x1155: file file.c, line 3.
> +
> +Thread 2.1 "a.out" hit Breakpoint 2, main () at file.c:3
> +3 return 0;
> +[Switching to inferior 1 [process 5714] (/tmp/test)]
> +[Switching to thread 1.1 (process 5714)]
> +#0 main () at test.c:2
> +2 int a = 1;
> +Done
> +@end smallexample
> +
> +@noindent
> +When suppressed, the output becomes
> +
> +@smallexample
> +(gdb) set suppress-notification-cli on
> +(gdb) do-setup
> +Setting up Inferior 2...
> +[New inferior 2]
> +Added inferior 2 on connection 1 (native)
> +Breakpoint 2 at 0x1155: file file.c, line 3.
> +Done
> +@end smallexample
> +
> +@kindex show suppress-notification-cli
> +@item show suppress-notification-cli
> +Displays whether printing CLI notification events is suppressed or
> +not.
> +@end table
> +
> @node Extending GDB
> @chapter Extending @value{GDBN}
> @cindex extending GDB
> diff --git a/gdb/testsuite/gdb.base/cli-suppress-notification.c b/gdb/testsuite/gdb.base/cli-suppress-notification.c
> new file mode 100644
> index 00000000000..ea7823a5d58
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/cli-suppress-notification.c
> @@ -0,0 +1,22 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> + Copyright 2020-2022 Free Software Foundation, Inc.
I think the from date is only needed if either (a) you originally
posted this is 2020, or (b) you copied this mostly unchanged from a
file that is already dated 2020.
> +
> + 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 ()
> +{
I'd be tempted to add something else into this function, anything will
do, another function call, or set a global variable or something, then...
> + return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/cli-suppress-notification.exp b/gdb/testsuite/gdb.base/cli-suppress-notification.exp
> new file mode 100644
> index 00000000000..856a737f238
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/cli-suppress-notification.exp
> @@ -0,0 +1,33 @@
> +# Copyright 2020-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/>.
> +
> +# Test the cli-suppress-notification command.
> +
> +standard_testfile
> +
> +if {[prepare_for_testing "failed to prepare" ${binfile} ${srcfile}]} {
> + return
> +}
> +
> +if {![runto_main]} {
> + return
> +}
> +
> +gdb_test "inferior 1" ".*Switching to inferior 1 .* to thread 1 .*" \
> + "not suppressed"
> +
> +gdb_test_no_output "set suppress-notification-cli on"
> +
> +gdb_test_no_output "inferior 1" "suppressed"
Here you can now easily add a test that something like "next" also has
its output suppressed.
I'd also like to see the tests turn the option back off, and check
that the notifications reappear.
Thanks,
Andrew
> --
> 2.33.1
>
> 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
>
More information about the Gdb-patches
mailing list