From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id iwGwIiA2vmrkLCMAWB0awg (envelope-from ) for ; Thu, 01 Oct 2026 06:29:52 -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=f+yA3bY8; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 5BE8C1E091; Thu, 01 Oct 2026 06:29:52 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-6.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 autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::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 203BD1E033 for ; Thu, 01 Oct 2026 06:29:35 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A0D134BB5927 for ; Thu, 1 Oct 2026 10:29:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A0D134BB5927 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=f+yA3bY8 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.14]) by sourceware.org (Postfix) with ESMTPS id 2B2FB4BB58F1 for ; Thu, 1 Oct 2026 10:28:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2B2FB4BB58F1 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 2B2FB4BB58F1 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=192.198.163.14 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790850534; cv=none; b=mpBcc+5zotB51Q5y1lonlVRnCrNmz1FC32HjVtiW/cEuZBBm2utJ+UJpBbnzlAfmQafgABOtudVFIb1PPSipoTs9i4ICkJBuAmwR11EKlMzWtyOb31Wof7i8m9KOaCRAdN7qxIKvsZ4twYOTtBgjdfeKtLipEY71rxHX/qtPuH0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790850534; c=relaxed/simple; bh=LHD2VAR4/x2ngxLv1rByuEkEhXDYQvIKLcaxQY7gTz4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=gTzaE+NO2KJJWl87au1rTFfkQXs75DEdyziWS8XQF0C7rP3jfCJPDn24thQAISfJlRSSX+4LDsUyPiHFZrcHKXV6RoT+IfkPueBivhYrzwNRKJbxENSz8DieXJrPuw+P3qseK7iE6AsqVNdmom6Q45HhEpcKJDmQ3JJqjw7YdNc= ARC-Authentication-Results: i=1; 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=f+yA3bY8 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2B2FB4BB58F1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1790850534; x=1822386534; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=LHD2VAR4/x2ngxLv1rByuEkEhXDYQvIKLcaxQY7gTz4=; b=f+yA3bY8lD0JTwaCCYZmrILfC3un4Ijbfxj9hGxA+zBrIyPULMGzHz6O HQkngqS7jGinPsM19JRaSSr6pvxuW4bNbWC/uFsdlB7VtN4KLZwRCcrd2 s4wX/I5W0LXKUtM0STTv6JZGchP0btp/JMPB8gGxpwNdsU7KvBonmXHVF zIlMXIaUh+QLe4w4YVnnTyfeT+VmgX0WK7X30C+vwnQu46kfZkL6iSbuJ iicyE3AJRvszxMWokHvTgkb/EJ9djGlFr4np2KKrxq89ew+z7JRieb1+7 /ulNlAZ2TwBJ3bQwL/NxOuNuvXvES47RiDq8Aq2VVjIPLxQ43aDMgyNRL w==; X-CSE-ConnectionGUID: j93LVOV7QGWFgntI/NKiUg== X-CSE-MsgGUID: WCjynbqXRqqeKOlFKtFjBQ== X-IronPort-AV: E=McAfee;i="6800,10657,11921"; a="91619602" X-IronPort-AV: E=Sophos;i="6.27,134,1787036400"; d="scan'208";a="91619602" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by fmvoesa108.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Oct 2026 03:28:53 -0700 X-CSE-ConnectionGUID: 9l6yrv2CQZSqNqvA2k6uyA== X-CSE-MsgGUID: gsoBJYn/TBiC+zWsb2ORBA== X-ExtLoop1: 1 Received: from gkldtt-dev-004.igk.intel.com (HELO localhost) ([10.123.221.202]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Oct 2026 03:28:52 -0700 From: Markus Metzger To: gdb-patches@sourceware.org Cc: Guinevere Larsen Subject: [RFC PATCH 1/8] gdb, infrun: do not discard a step-completed pending waitstatus Date: Thu, 1 Oct 2026 12:28:40 +0200 Message-ID: <20261001102847.576880-2-markus.t.metzger@intel.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261001102847.576880-1-markus.t.metzger@intel.com> References: <20261001102847.576880-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 Consider a scenario with two breakpoints on adjacent instructions: bp1 at 0xf00 bp2 at 0xf01 as well as two threads in all-stop-on-top-of-non-stop mode. Assume that threads A hits bp1 and we report the breakpoint hit to the user. When the user continues, we start a step-over for thread A at 0xf00. Assume that thread B now hits bp1 and we report the breakpoint hit to the user. We stop all threads to report the event. Meanwhile, the step-over of thread A completes, so we save the pending waitstatus (stop_pc=0xf01, currently_stepping=1) of thread A. When the user continues, clear_proceed_status_thread() discards the pending step completed waitstatus of thread A, and proceed() starts another step-over for thread A at 0xf01. We skip bp2 for thread A. Remove the code in clear_proceed_status_thread() that discards a step completed waitstatus and let it get handled normally. This involves calling finish_step_over() to clean up displaced stepping state. This introduces an additional step completed stop event for thread A that results in two user-visible changes in behavior when switching to thread A and resuming that thread: - stepi/nexti completes without making progress - adding a breakpoint at the current location before resuming hits that breakpoint Fixes gdb/34380. Tested-By: Guinevere Larsen --- gdb/infrun.c | 25 ++----- gdb/testsuite/gdb.threads/adjacent-bp.c | 48 +++++++++++++ gdb/testsuite/gdb.threads/adjacent-bp.exp | 86 +++++++++++++++++++++++ 3 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 gdb/testsuite/gdb.threads/adjacent-bp.c create mode 100644 gdb/testsuite/gdb.threads/adjacent-bp.exp diff --git a/gdb/infrun.c b/gdb/infrun.c index 47966cf72db..a70d88cd4a7 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3100,28 +3100,13 @@ clear_proceed_status_thread (struct thread_info *tp) infrun_debug_printf ("%s", tp->ptid.to_string ().c_str ()); gdb_assert (tp->internal_state () != THREAD_INT_RUNNING); - /* If we're starting a new sequence, then the previous finished - single-step is no longer relevant. */ if (tp->has_pending_waitstatus ()) { - if (tp->stop_reason () == TARGET_STOPPED_BY_SINGLE_STEP) - { - infrun_debug_printf ("pending event of %s was a finished step. " - "Discarding.", - tp->ptid.to_string ().c_str ()); - - tp->set_internal_state (THREAD_INT_STOPPED); - tp->clear_pending_waitstatus (); - tp->set_stop_reason (TARGET_STOPPED_BY_NO_REASON); - } - else - { - infrun_debug_printf - ("thread %s has pending wait status %s (currently_stepping=%d).", - tp->ptid.to_string ().c_str (), - tp->pending_waitstatus ().to_string ().c_str (), - tp->control.currently_stepping); - } + infrun_debug_printf + ("thread %s has pending wait status %s (currently_stepping=%d).", + tp->ptid.to_string ().c_str (), + tp->pending_waitstatus ().to_string ().c_str (), + tp->control.currently_stepping); } /* If this signal should not be seen by program, give it zero. diff --git a/gdb/testsuite/gdb.threads/adjacent-bp.c b/gdb/testsuite/gdb.threads/adjacent-bp.c new file mode 100644 index 00000000000..e72e674f52a --- /dev/null +++ b/gdb/testsuite/gdb.threads/adjacent-bp.c @@ -0,0 +1,48 @@ +/* Copyright 2026 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#include +#include + +static pthread_barrier_t barrier; + +static void * +test (void *arg) +{ + pthread_barrier_wait (&barrier); + int a = 0; /* break here. */ + int b = 0; + int c = 0; + return arg; +} + +int +main () +{ + pthread_t th; + + alarm (500); + + pthread_barrier_init (&barrier, NULL, 2); + pthread_create (&th, NULL, test, NULL); + test (NULL); + + pthread_join (th, NULL); + pthread_barrier_destroy (&barrier); + + return 0; +} diff --git a/gdb/testsuite/gdb.threads/adjacent-bp.exp b/gdb/testsuite/gdb.threads/adjacent-bp.exp new file mode 100644 index 00000000000..9e7782c01c2 --- /dev/null +++ b/gdb/testsuite/gdb.threads/adjacent-bp.exp @@ -0,0 +1,86 @@ +# Copyright 2026 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 GDB does not skip a breakpoint when a step-over completes +# while another event leads to a stop. + +standard_testfile + +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \ + {debug pthreads}]} { + return +} + +if {![runto_main]} { + return +} + +# Find a sequence of adjacent instructions. +set bp_line [gdb_get_line_number "break here"] +set pcs {} +gdb_test_multiple "info line $bp_line" "" { + -re -wrap "starts at address ($hex).*" { + pass $gdb_test_name + + set line "\\s+($hex) \[^\r\n\]+" + gdb_test_multiple "x/3i $expect_out(1,string)" "disassemble" { + -re -wrap "$line\r\n$line\r\n$line.*" { + pass $gdb_test_name + + lappend pcs $expect_out(1,string) + lappend pcs $expect_out(2,string) + lappend pcs $expect_out(3,string) + } + -re -wrap "" { + fail $gdb_test_name + } + } + } + -re -wrap "" { + fail $gdb_test_name + } +} + +# Set breakpoints on adjacent instructions. +foreach pc $pcs { + gdb_breakpoint "\*$pc" +} + +# Continue from breakpoint to breakpoint. +set hits [dict create] +set iter 0 +gdb_test_multiple "continue" "" { + -re -wrap "hit Breakpoint.*" { + dict incr hits [get_hexadecimal_valueof "\$pc" invalid "stop $iter"] + incr iter + send_gdb "continue\n" + exp_continue + } + -re -wrap "$inferior_exited_re normally.*" { + pass "$gdb_test_name" + } +} + +# We expect all breakpoints to be hit by both threads. +foreach pc $pcs { + if {[dict exists $hits $pc]} { + gdb_assert {[dict get $hits $pc] eq 2} "breakpoint at $pc" + dict unset hits $pc + } else { + fail "breakpoint at $pc" + } +} +# And no unrelated stops. +gdb_assert {[dict size $hits] eq 0} "no extra stops" -- 2.53.0 ________________________________________ Intel Deutschland GmbH Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany Tel: +49 (89) 99143-0 www.intel.de Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman Chairperson of the Supervisory Board: Sonja Pierer Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.