From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id mV95ETM932krjxgAWB0awg (envelope-from ) for ; Wed, 15 Apr 2026 03:24:35 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=oAvtqbfg; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 434881E0B1; Wed, 15 Apr 2026 03:24:35 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,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 9B6181E0B1 for ; Wed, 15 Apr 2026 03:24:34 -0400 (EDT) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 2067E4BA2E39 for ; Wed, 15 Apr 2026 07:24:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2067E4BA2E39 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=oAvtqbfg Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.8]) by sourceware.org (Postfix) with ESMTPS id C7E504BA2E15 for ; Wed, 15 Apr 2026 07:23:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C7E504BA2E15 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C7E504BA2E15 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.198.163.8 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776237801; cv=none; b=jwlrzJA9ulDPLhph5GQVs5lgFG3Vx1lairDqFkKuSErhh8tksG207M+dWE79jEAXoNGFBsl0IWtBH6I3BKF18JNtDWtNKmdv4mkSQKtUzu8WXsNFnNsk00sBd0r8ZqkMWK1jCrrv7EZHl8th95Wmv4MDJJUrE5l9Lzew/FE8E0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776237801; c=relaxed/simple; bh=hoM2eRv6WNUXzvCYzRgA5wPzv3/U0iE/iQiUpaC0n6s=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=NXvA7n36v/cOvFqpk8+Lj9+s9vJtG0AjL2Um3g7hxOTCn6yE4HquN53Yw7rx5YvuwrELvNQ9A3jtnZwkqlzBMrQAcAExlOK6l8p4RjDXaXqzBALg+iTA1ixltT2HVAXhUkYC2uoc+tUeqrwI9jCgmzrZnj4PkkzB0f7z69qjCyo= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C7E504BA2E15 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1776237801; x=1807773801; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=hoM2eRv6WNUXzvCYzRgA5wPzv3/U0iE/iQiUpaC0n6s=; b=oAvtqbfgQDOWRurAU1SRVhhjvWBJNofg8/nmHElzYDflekmjJBbOlZ2R kZpaGKH46E0lGv71juYm//JU0eIdtJIqZz9MrhJPj8GPGeClB9PeUNRVD K3iWkaindwXNqFWjqTnhhE5DTY5yeqWqAZ593Wh3Yeyo4p2O5NErX4Z0f SObihn7CdmzYTfJ8oX069EFqR2rPiTWrMdTlZdbg8ZhVzDrNxb6I/q4nx KbZapCoNgKpzBnr8RaUuI8n8vCTpGFCABXK7kK/pMgHRNZBIHYanzgwyS X/mu8pUjvmUc1cx3T4lcGkYqf0r2v2UzeaNlFaqGyroGn3Ab+jLNCPyDf w==; X-CSE-ConnectionGUID: TRKrRpNgT9axW3q+N2Vzyw== X-CSE-MsgGUID: +VIaI6vOSWKy8OLk6trvEA== X-IronPort-AV: E=McAfee;i="6800,10657,11759"; a="94776403" X-IronPort-AV: E=Sophos;i="6.23,179,1770624000"; d="scan'208";a="94776403" Received: from orviesa009.jf.intel.com ([10.64.159.149]) by fmvoesa102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2026 00:23:21 -0700 X-CSE-ConnectionGUID: glL79rwpSZehzlDpYwOYGg== X-CSE-MsgGUID: qeihjwxGQV+GMHmC95ZGPg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,179,1770624000"; d="scan'208";a="230194915" Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by orviesa009-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2026 00:23:19 -0700 From: Markus Metzger To: gdb-patches@sourceware.org Cc: Guinevere Larsen Subject: [PATCH v8 2/4] gdb, infrun, record: fix hang when step-over fails with no-history Date: Wed, 15 Apr 2026 07:23:09 +0000 Message-Id: <20260415072311.3597558-3-markus.t.metzger@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260415072311.3597558-1-markus.t.metzger@intel.com> References: <20260415072311.3597558-1-markus.t.metzger@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 When trying to step over a breakpoint at the end of the trace while another thread is replaying, the step-over will fail with no-history. This does not clear step_over_info so a subsequent resume will cause GDB to not resume the thread and expect a SIGTRAP to complete the step-over. This will never come causing GDB to hang in the wait-for-event poll. This is a variant of the issue fixed in the parent commit. That commit addressed the issue for a single-threaded process and fixed an issue with reverse/replay stepping in general. This commit addresses the issue for a multi-threaded process. In this case, the single-step does not complete. Finish an in-flight step-over when a thread stopped with NO_HISTORY. Since we did not move, we will simply start the step-over again. Hannes Domani reported that this fixes PR gdb/31353. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31353 Reviewed-By: Guinevere Larsen --- gdb/infrun.c | 12 +++ .../gdb.btrace/multi-thread-break-hang.exp | 85 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 gdb/testsuite/gdb.btrace/multi-thread-break-hang.exp diff --git a/gdb/infrun.c b/gdb/infrun.c index daddcc14f90..ac3449d1e19 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -78,6 +78,8 @@ #include "finish-thread-state.h" #include "buffered-streams.h" +struct execution_control_state; + /* Prototypes for local functions */ static void sig_print_info (enum gdb_signal); @@ -6594,6 +6596,16 @@ handle_inferior_event (struct execution_control_state *ecs) return; interps_notify_no_history (); + + /* Cancel an in-flight step-over. It will not succeed since we + won't be able to step at the end of the execution history. */ + { + /* finish_step_over may call restart_threads, which may change the + current thread. make sure we leave the event thread as the + current thread. */ + scoped_restore_current_thread restore_thread; + finish_step_over (ecs); + } stop_waiting (ecs); return; } diff --git a/gdb/testsuite/gdb.btrace/multi-thread-break-hang.exp b/gdb/testsuite/gdb.btrace/multi-thread-break-hang.exp new file mode 100644 index 00000000000..a597878707e --- /dev/null +++ b/gdb/testsuite/gdb.btrace/multi-thread-break-hang.exp @@ -0,0 +1,85 @@ +# This testcase is part of GDB, the GNU debugger. +# +# Copyright 2025 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 that we cancel an in-flight step-over at the end of the execution +# history as long as some other thread is still replaying. +# +# This used to cause GDB to hang in poll (). + +require allow_btrace_tests + +standard_testfile multi-thread-step.c +if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ + {debug pthreads}]} { + return -1 +} + +if {![runto_main]} { + return -1 +} + +# Set up breakpoints. +set bp_1 [gdb_get_line_number "bp.1" $srcfile] +set bp_2 [gdb_get_line_number "bp.2" $srcfile] + +# Trace the code between the two breakpoints. +gdb_breakpoint $srcfile:$bp_1 +gdb_continue_to_breakpoint "continue to bp.1" ".*$srcfile:$bp_1\r\n.*" + +gdb_test_no_output "record btrace" + +# We have two threads at or close to bp.1 but handled only one stop event. +# Remove the breakpoint so we do not need to deal with the 2nd event. +delete_breakpoints +gdb_breakpoint $srcfile:$bp_2 +gdb_continue_to_breakpoint "continue to bp.2" ".*$srcfile:$bp_2\r\n.*" + +# Determine the thread that reported the breakpoint. +set thread [get_integer_valueof "\$_thread" bad] + +# Determine the other thread. +set other "bad" +if { $thread == 1 } { + set other 2 +} elseif { $thread == 2 } { + set other 1 +} + +# This test requires scheduler-locking 'on' or 'step'; 'replay' would +# implicitly stop replaying, avoiding the problem; 'off' would step one +# and resume the other. +# +# With the current record-btrace implementation that steps all resumed +# threads in lock-step, 'off' might actually pass but we don't want to +# bake that behavior into tests. +gdb_test_no_output "set scheduler-locking step" + +# Start replaying the other thread. This will prevent stepping the thread +# that reported the event. +gdb_test "thread apply $other record goto begin" +gdb_test "thread apply $other info record" "Replay in progress.*" + +# We're at a breakpoint so this triggers step-over. Since we're at the +# end of the trace, the step will fail. +gdb_test "stepi" "Reached end of recorded history.*" "stepi.1" + +# We used to hang at the second step since step-over insisted on polling +# the next event. +gdb_test "stepi" "Reached end of recorded history.*" "stepi.2" + +# Do one more just in case. +gdb_test "stepi" "Reached end of recorded history.*" "stepi.3" -- 2.34.1 Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 89 991 430, www.intel.de Managing Directors: Harry Demas, Jeffrey Schneiderman, Yin Chong Sorrell Chairperson of the Supervisory Board: Nicole Lau Registered Seat: Munich Commercial Register: Amtsgericht Muenchen HRB 186928