From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2126) id 59C543858D35; Wed, 29 Dec 2021 17:38:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 59C543858D35 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Tom Tromey To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Fix logging redirection bug with pager X-Act-Checkin: binutils-gdb X-Git-Author: Tom Tromey X-Git-Refname: refs/heads/master X-Git-Oldrev: ba0084966cfee307631aba6d0f052a39ad773909 X-Git-Newrev: 84b334970bb5892a1f50a3d8e9a569263a502224 Message-Id: <20211229173801.59C543858D35@sourceware.org> Date: Wed, 29 Dec 2021 17:38:01 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Dec 2021 17:38:01 -0000 https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=84b334970bb5892a1f50a3d8e9a569263a502224 commit 84b334970bb5892a1f50a3d8e9a569263a502224 Author: Tom Tromey Date: Mon Dec 27 10:53:16 2021 -0700 Fix logging redirection bug with pager I noticed yesterday that if gdb output is redirected to a file, the pager will still be active. This is irritating, because the output isn't actually visible -- just the pager prompt. Looking in bugzilla, I found that this had been filed 17 years ago, as PR cli/8798. This patch fixes the bug. It changes the pagination code to query the particular ui-file to see if paging is allowable. The ui-file implementations are changed so that only the stdout implementation and a tee (where one sub-file is stdout) can page. Regression tested on x86-64 Fedora 34. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=8798 Diff: --- gdb/testsuite/gdb.base/page-logging.exp | 51 +++++++++++++++++++++++++++++++++ gdb/ui-file.h | 20 +++++++++++++ gdb/utils.c | 2 +- 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/gdb/testsuite/gdb.base/page-logging.exp b/gdb/testsuite/gdb.base/page-logging.exp new file mode 100644 index 00000000000..8071687b3a1 --- /dev/null +++ b/gdb/testsuite/gdb.base/page-logging.exp @@ -0,0 +1,51 @@ +# Copyright (C) 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 . + +# Do not run if gdb debug is enabled as it will interfere with log redirect. +if [gdb_debug_enabled] { + untested "debug is enabled" + return 0 +} + +gdb_start + +gdb_test_no_output "set width 100" +gdb_test_no_output "set height 5" +gdb_test_no_output "set pagination on" + +# Test that logging redirect disables the pager. +set log_name [standard_output_file log.txt] +gdb_test_no_output "set logging file $log_name" \ + "set logging filename" +gdb_test_no_output "set logging redirect on" +gdb_test "set logging enabled on" "Copying debug output to .*" +set ok 1 +set str "1\\n2\\n3\\n4\\n5\\n" +gdb_test_multiple "printf \"$str\"" "printf without paging" { + -re "$pagination_prompt" { + set ok 0 + send_gdb "c\n" + exp_continue + } + -re "\r\n$gdb_prompt $" { + # Ok. + } +} +if {$ok} { + pass "printf without paging" +} else { + fail "printf without paging" +} +gdb_test "set logging enabled off" "Done logging to .*" diff --git a/gdb/ui-file.h b/gdb/ui-file.h index 9593c94e673..0faf84996aa 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -88,6 +88,14 @@ public: Otherwise, return -1. */ virtual int fd () const { return -1; } + + /* Return true if this object supports paging, false otherwise. */ + virtual bool can_page () const + { + /* Almost no file supports paging, which is why this is the + default. */ + return false; + } }; typedef std::unique_ptr ui_file_up; @@ -204,6 +212,11 @@ public: int fd () const override { return m_fd; } + virtual bool can_page () const override + { + return m_file == stdout; + } + private: /* Sets the internal stream to FILE, and saves the FILE's file descriptor in M_FD. */ @@ -278,6 +291,13 @@ public: bool can_emit_style_escape () override; void flush () override; + virtual bool can_page () const override + { + /* If one of the underlying files can page, then we allow it + here. */ + return m_one->can_page () || m_two->can_page (); + } + private: /* The two underlying ui_files. */ ui_file *m_one; diff --git a/gdb/utils.c b/gdb/utils.c index eba1acbc8f6..f8c898dd502 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -1749,7 +1749,7 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream, return; /* Don't do any filtering if it is disabled. */ - if (stream != gdb_stdout + if (!stream->can_page () || !pagination_enabled || pagination_disabled_for_command || batch_flag