From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id E84493858C2C for ; Wed, 2 Feb 2022 15:35:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E84493858C2C Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-169-Z_xR1jsxN6Sy410buS918g-1; Wed, 02 Feb 2022 10:35:01 -0500 X-MC-Unique: Z_xR1jsxN6Sy410buS918g-1 Received: by mail-wr1-f71.google.com with SMTP id g6-20020adfbc86000000b001a2d62be244so6890064wrh.23 for ; Wed, 02 Feb 2022 07:35:00 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=FOHzuDmKX1nfx0JyvBdAYtVqCi11e9IfKH6nFbeDn6E=; b=JLUi63GXdKkt+en9rSPI242F4e9oJt0f2OX0qufi76O+wdF/gxZoUgHkuB1rrXAKoj 31JyHNWpbw6HuU745tMaHeJmXUQjlz9PrwX1/XHO54k6NJBzbsc0F2fSKciOTWAJBVD4 AnFhuERQUlomSAnLMYrZMmNkSYyarx7IQwOlYP+SMa2+ssl1Wk67XUAYIOb4zyRxQp53 TereJq9ndrhWAEP4CsZIZlmUirgEW5qADQHwNsl2Ntldm/y0311FneEAX6R0qeBRNpw5 BNeWLV0hzu9ChZAvSvm9bEmSiF+s5loWmZl0/DZolBVdFhexxXLjusxd6RFmKkFSXLFQ 8bcA== X-Gm-Message-State: AOAM531gYQpS/N+6ACHk5j+4PsSuCqtw23iAPdqFeu3GsI7xy5mHPCy6 M5b8FnxubQ6qDKadLcmmHNG7xctC1hGM+m/Etlmoiq9RHISd1kIdrZ/BwP+VTv3KBdtJcV0ae0J LXpzTIO2czwp9hysuZAVk+g== X-Received: by 2002:a05:600c:420a:: with SMTP id x10mr6552414wmh.39.1643816099680; Wed, 02 Feb 2022 07:34:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJxIBKbnyHE2yELGvD6imTJCUcemvgD33dDrVvgc6x3ZNPRH612kfMQyh62Y+6yWR2XFZUz3qQ== X-Received: by 2002:a05:600c:420a:: with SMTP id x10mr6552388wmh.39.1643816099254; Wed, 02 Feb 2022 07:34:59 -0800 (PST) Received: from localhost (host86-140-92-93.range86-140.btcentralplus.com. [86.140.92.93]) by smtp.gmail.com with ESMTPSA id a6sm17391901wrx.101.2022.02.02.07.34.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Feb 2022 07:34:58 -0800 (PST) Date: Wed, 2 Feb 2022 15:34:57 +0000 From: Andrew Burgess To: Tankut Baris Aktemur Cc: gdb-patches@sourceware.org, tom@tromey.com, eliz@gnu.org Subject: Re: [PATCH v2 3/3] gdb: add the 'set/show suppress-notification-cli' command Message-ID: <20220202153457.GH425591@redhat.com> References: <2f8b43b4d7c06062c0bbabef11b8e3b6ced1594f.1642678193.git.tankut.baris.aktemur@intel.com> MIME-Version: 1.0 In-Reply-To: <2f8b43b4d7c06062c0bbabef11b8e3b6ced1594f.1642678193.git.tankut.baris.aktemur@intel.com> X-Operating-System: Linux/5.8.18-100.fc31.x86_64 (x86_64) X-Uptime: 15:29:54 up 9 days, 6:16, X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_INVALID, DKIM_SIGNED, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 Feb 2022 15:35:06 -0000 * Tankut Baris Aktemur [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 [] (/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 [] (/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 [] (/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 . */ > + > +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 . > + > +# 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 > 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 >