From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id X9B+CAoP22pLHA8AWB0awg (envelope-from ) for ; Fri, 23 Oct 2026 03:38:50 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 0CBBC378003; Fri, 23 Oct 2026 03:38:50 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id ABF8E378002 for ; Fri, 23 Oct 2026 03:38:48 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C2FD14BA79B9 for ; Fri, 23 Oct 2026 07:38:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C2FD14BA79B9 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2a07:de40:b251:101:10:150:64:2]) by sourceware.org (Postfix) with ESMTPS id 676A14BA79B0 for ; Fri, 23 Oct 2026 07:38:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 676A14BA79B0 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 676A14BA79B0 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:2 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792741095; cv=none; b=aF/CnNt8OkDUpGkbyqfVK/1sVwoXGMsjf0L10H4p6rwQlapRm/9pKNEvB9OBEhIioJng/3X99N4lMgqfIvB6rOJhNKbJA3TwlgAdGdve0fz6kfdnLqlCGrV+KhVdUY0Irwq5bT2ZPItIWyj77k80uvHvebm0xSjrJRm0hrn8oG4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1792741095; c=relaxed/simple; bh=nexc999/vs4bbDjZlbeW+DBHslTDDsjEIonZy7Qb1bc=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=v6/Ztj276ThJiWXcq6xeaU+LCO9mI5dHKDq8j/wEuD8DspsXvr2kKkjvZ391WOFcmVHJE/nlS1PhQkyFgh5+iRb4sMBVlhC5ReL8CGaIYxleWILwEWCTuGAahWj63apNKu80eviuDj6yIZ+N0p38vvHDAxWYVgeWuGynVFdQzgY= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=p5VgLXVE; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=I7FVwn5X DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 676A14BA79B0 Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 7708E1F44E for ; Fri, 23 Oct 2026 07:38:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1792741094; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L9xoOoIJJs7NLzY9Tefw2eH/82T/JitSEPaYurW85+0=; b=p5VgLXVEapi1rZpBUKm7INI94QyX+WcU6tl2lKV94k/bnkByLW8u+mf9x3CQNxKhiKvEqc hJqRfNCNemmrU06H7eTB/Mp/VlEwiS7IXpEWqL5isY5WMVSKuS4A1TVk50BqkPKBz0Hrh+ Hi4JqUYTqlTN1YGlKU+3B4kssyrk3Nc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1792741094; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L9xoOoIJJs7NLzY9Tefw2eH/82T/JitSEPaYurW85+0=; b=I7FVwn5XrECeOr/L5Yo6oSEg9isH3GYiOQZiw6+L0gNAn/+LyAT8TmiC13LskDRJzlz8fk Sk0q9UmobW+pFkAQ== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1792741094; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L9xoOoIJJs7NLzY9Tefw2eH/82T/JitSEPaYurW85+0=; b=p5VgLXVEapi1rZpBUKm7INI94QyX+WcU6tl2lKV94k/bnkByLW8u+mf9x3CQNxKhiKvEqc hJqRfNCNemmrU06H7eTB/Mp/VlEwiS7IXpEWqL5isY5WMVSKuS4A1TVk50BqkPKBz0Hrh+ Hi4JqUYTqlTN1YGlKU+3B4kssyrk3Nc= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1792741094; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L9xoOoIJJs7NLzY9Tefw2eH/82T/JitSEPaYurW85+0=; b=I7FVwn5XrECeOr/L5Yo6oSEg9isH3GYiOQZiw6+L0gNAn/+LyAT8TmiC13LskDRJzlz8fk Sk0q9UmobW+pFkAQ== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 490A3134EA for ; Fri, 23 Oct 2026 07:38:14 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id Jy73LeUO22qkUAAAD6G6ig:T4 (envelope-from ) for ; Fri, 23 Oct 2026 07:38:14 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH 3/3] [gdb] Fix backtrace in log file (execinfo case) Date: Fri, 23 Oct 2026 09:38:13 +0200 Message-ID: <20261023073813.2224939-4-tdevries@suse.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20261023073813.2224939-1-tdevries@suse.de> References: <20261023073813.2224939-1-tdevries@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spamd-Result: default: False [-11.80 / 50.00]; SUSE_INTERNAL_BYPASS(-9.00)[]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; RCPT_COUNT_ONE(0.00)[1]; RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:helo,gnu.org:url]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_COUNT_TWO(0.00)[2]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; RCVD_TLS_ALL(0.00)[] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Consider test-case gdb.base/logging-internal-error.exp. It enables logging to a file log.txt, and then does "maint internal-error". Now say we build gdb with --disable-libbacktrace, and run the test-case. In gdb.log we find the expected output: ... (gdb) maint internal-error gdb/maint.c:82: internal-error: A problem internal to GDB has been detected, further debugging may prove unreliable. ----- Backtrace ----- gdb/gdb() [0x659b60] ... gdb/gdb() [0xbb2f72] Backtrace might be incomplete. --------------------- This is a bug, please report it. For instructions, see: . Command aborted. (gdb) ... But in log.txt, we have: ... gdb/maint.c:82: internal-error: A problem internal to GDB has been detected, further debugging may prove unreliable. ----- Backtrace ----- Backtrace might be incomplete. --------------------- This is a bug, please report it. For instructions, see: . Command aborted. ... Make the test-case detect this by making a regexp a bit stricter. The problem is in gdb_internal_backtrace_1, where we do: ... int fd = ((gdb_stderr == nullptr || gdb_stderr->fd () == -1) ? 2 : gdb_stderr->fd ()); backtrace_symbols_fd (buffer, frames, fd); ... We want to write to two files, but there's just one file descriptor. Fix this by adding a new member function ui_file::for_each_fd, and using it in gdb_internal_backtrace_1 to call backtrace_symbols_fd. --- gdb/bt-utils.c | 12 ++++++++---- gdb/cli/cli-logging.c | 14 ++++++++++++++ gdb/logging-file.h | 1 + .../gdb.base/logging-internal-error.exp | 2 +- gdb/ui-file.h | 16 ++++++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/gdb/bt-utils.c b/gdb/bt-utils.c index fcb912c8021..b0000e92da2 100644 --- a/gdb/bt-utils.c +++ b/gdb/bt-utils.c @@ -134,10 +134,14 @@ gdb_internal_backtrace_1 () void *buffer[25]; int frames = backtrace (buffer, ARRAY_SIZE (buffer)); - int fd = ((gdb_stderr == nullptr || gdb_stderr->fd () == -1) - ? 2 - : gdb_stderr->fd ()); - backtrace_symbols_fd (buffer, frames, fd); + bool handled = (gdb_stderr != nullptr + && gdb_stderr->for_each_fd ([&] (int fd) + { + backtrace_symbols_fd (buffer, frames, fd); + })); + if (!handled) + backtrace_symbols_fd (buffer, frames, 2); + if (frames == ARRAY_SIZE (buffer)) sig_write (_("Backtrace might be incomplete.\n")); } diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c index d8212de4abb..53fc66dda56 100644 --- a/gdb/cli/cli-logging.c +++ b/gdb/cli/cli-logging.c @@ -187,6 +187,20 @@ logging_file::write_async_safe (const char *buf, long length_buf) /* See logging-file.h. */ +template +bool +logging_file::for_each_fd (gdb::function_view f) +{ + bool handled = false; + if (log_file != nullptr) + handled = log_file->for_each_fd (f); + if (ordinary_output ()) + handled = m_out->for_each_fd (f); + return handled; +} + +/* See logging-file.h. */ + template void logging_file::puts (const char *linebuffer) diff --git a/gdb/logging-file.h b/gdb/logging-file.h index f8b9f101150..7a4c265ed08 100644 --- a/gdb/logging-file.h +++ b/gdb/logging-file.h @@ -47,6 +47,7 @@ class logging_file : public ui_file bool can_page () const override; void emit_style_escape (const ui_file_style &style) override; void puts_unfiltered (const char *str) override; + bool for_each_fd (gdb::function_view f) override; bool isatty () override { diff --git a/gdb/testsuite/gdb.base/logging-internal-error.exp b/gdb/testsuite/gdb.base/logging-internal-error.exp index b121ca42612..9a46ed7c3e2 100644 --- a/gdb/testsuite/gdb.base/logging-internal-error.exp +++ b/gdb/testsuite/gdb.base/logging-internal-error.exp @@ -69,7 +69,7 @@ close $fd set test "Logged backtrace" if {$seen_bt} { - gdb_assert {[regexp $re_bt $data]} $test + gdb_assert {[regexp $re_bt.*$hex $data]} $test } else { unsupported $test } diff --git a/gdb/ui-file.h b/gdb/ui-file.h index 23cbd2c7e78..6ef9722ead8 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -22,6 +22,7 @@ #include #include #include "ui-style.h" +#include "gdbsupport/function-view.h" /* The abstract ui_file base class. */ @@ -117,6 +118,18 @@ class ui_file virtual int fd () const { return -1; } + /* Use this function to write to a file descriptor, rather than using + write (fd (), ...). In some cases, multiple descriptors need to be + written. Return true if the write was handled. */ + virtual bool for_each_fd (gdb::function_view f) + { + int fd = this->fd (); + if (fd == -1) + return false; + f (fd); + return true; + } + /* Return true if this object supports paging, false otherwise. */ virtual bool can_page () const { @@ -436,6 +449,9 @@ class wrapped_file : public ui_file int fd () const override { return m_stream->fd (); } + bool for_each_fd (gdb::function_view f) override + { return m_stream->for_each_fd (f); } + void puts_unfiltered (const char *str) override { m_stream->puts_unfiltered (str); } -- 2.51.0