[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