From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id Py7KH9iy+Gng8hIAWB0awg (envelope-from ) for ; Mon, 04 May 2026 10:53:12 -0400 Received: by simark.ca (Postfix, from userid 112) id 6DDDB1E067; Mon, 04 May 2026 10:53:12 -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.3 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,WEIRD_PORT 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 576331E067 for ; Mon, 04 May 2026 10:53:11 -0400 (EDT) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id D62AF4BABF0D for ; Mon, 4 May 2026 14:53:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D62AF4BABF0D Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by sourceware.org (Postfix) with ESMTPS id 921B74BABF0D for ; Mon, 4 May 2026 14:52:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 921B74BABF0D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 921B74BABF0D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.221.41 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777906365; cv=none; b=dXKw7EAa6Jw15/1aaO3Jp0ZVnjViZKl65Iyj98LMqUhb6mZ44mXOsVRNBT/KyTx72wegbfVJUS83XHgdNiDhm+Q0uVNsZvqfkyoQcz2nd+Qe88dfnPEH95bDGWMXyDu9lTqa6ieUxFL52LqBHAZPomy00L+5bokJeqBrMJpRl+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777906365; c=relaxed/simple; bh=Da01VMH8VeClPfwgFabvyUFR61jYxRKoaqZAO1q/goc=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=CaDgRduO+VaGyYNGbflSYn2IeaUlOkyEHd11GxwY2OQiw3NWoNKx+CTJWui1Td76RzRsDhJNsJJuzfzj3R3x4oCJMLTegGGg1X2NvYViowJdfvOs9SEvZMX6IBExbP2zVzoTKtpyILNVyPae9VaKxUsyBWx0Mip0XKwD8+qkU8k= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 921B74BABF0D Received: by mail-wr1-f41.google.com with SMTP id ffacd0b85a97d-43fe3e22e33so2303555f8f.0 for ; Mon, 04 May 2026 07:52:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777906364; x=1778511164; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PH8+joTdNL1bmu8JcBUrazFiWaN7UrINQwukOJvfbig=; b=SICN3FfFOWZnfZYIJlV6Muuuew7saeadBG39r/rHzP3S6b2Cxyg3V8XtNH8UVO+kNo 9X2KB3lHagr9jVs5zCiHBZQxfJXuh+XOU4OgIHMjxHEVjQPkWO178EP1nLO+m2CEUk9L oL8Sy1vX5ZQrz7kSDlXZkvdyAFz5UZc9yVWqkmYUfKuNBeqxY/qnOkB8L12wq5RS8fUP j8hzkBY7xrjgycD5VLhw88JU5l+XT5iCfmYYxWbDPrTx7P4MFrizBCzoH7CGmcoeuaAW her24CcsWp2Wu5Fbv2vctxDWafnldLvVoorWpjQB/2Bdp/xQ7A4npzBnqZWwFtrjnXqP xMTA== X-Gm-Message-State: AOJu0YwwzDLUxpDDpou0FW2aiTVWfUjpk3bAOAnZU9tCPobPHtIPlZYL jP7Xc2qKPcetpXTrhipD+HuYUBzkMkLZEnGfvFfTv7GTOJZ0vcSuDVUWfqQSJg== X-Gm-Gg: AeBDievUFOS3fBeW78cQ9cUaglOnOYgBOIrzMKwMqIZiye/EWC19JHdvwFP6IygbF8x iXdutajlUtB8QGuyWODWreGwqkPL+Pc+mMVW6RBNSHPl5uiwuhBhxwd8sSyG27Tl7AlvHuFGknZ vFb5dv5TBKvyWghudC+/92lpmn7Shk7O6HFMkkQx8ZRrvsdWD8Fw+UZgg1uAFtFhoq0HlZYV5jf 7nXEGlLLHkTEM4hP3ESaF3Y1un9W/4S9gUHOyjh/PTlDbfiF99ZlKYpOdLBp0xVj7uAIbE7Wd5u nEVKSy3mI78JNlJg07cu9V9rgBlgiBpkIdCBVVIVzPvLJyM/V8v9L2sCf500hoRYIDtDNTvXAjd utIJUPnOn4lJ3ZQ7D731sBvlfSk+a0HYv797vTXKgwLTDgfHeYMpUbASapgqu2IJm8zRXhq4A1+ Ffvjxc6RD+F2pa4TShLf+XvOsI5EjaePVuRxNxxg9ZDuA= X-Received: by 2002:a5d:5f44:0:b0:43d:70de:1c68 with SMTP id ffacd0b85a97d-44bb5963dfcmr16770098f8f.30.1777906363849; Mon, 04 May 2026 07:52:43 -0700 (PDT) Received: from localhost ([2001:8a0:facb:a800:f625:f0b7:9de7:360b]) by smtp.gmail.com with UTF8SMTPSA id ffacd0b85a97d-44b638ac434sm22797307f8f.36.2026.05.04.07.52.43 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 04 May 2026 07:52:43 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH] Fix MI "-break-insert -g i" assertion failure Date: Mon, 4 May 2026 15:52:42 +0100 Message-ID: <20260504145242.1253541-1-pedro@palves.net> X-Mailer: git-send-email 2.53.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Passing a non-existing inferior to -break-insert's -g option trips an assertion: (gdb) interpreter-exec mi "222-break-insert -g i100 foo" &"../../src/gdb/breakpoint.c:9165: internal-error: find_program_space_for_breakpoint: Assertion `inf != nullptr' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable." &"\n" ... >From here: (top-gdb) bt #0 internal_error_loc (file=0x555556187e56 "../../src/gdb/breakpoint.c", line=9165, fmt=0x555556187bc8 "%s: Assertion `%s' failed.") at ../../src/gdbsupport/errors.cc:53 #1 0x0000555555791a55 in find_program_space_for_breakpoint (thread=-1, inferior=100) at ../../src/gdb/breakpoint.c:9165 #2 0x0000555555791f96 in create_breakpoint (gdbarch=0x5555568db900, locspec=0x5555567e7100, cond_string=0x0, thread=-1, inferior=100, extra_string=0x0, force_condition=false, parse_extra=0, tempflag=0, type_wanted=bp_breakpoint, ignore_count=0, pending_break_support=AUTO_BOOLEAN_FALSE, ops=0x555556642aa0 , from_tty=0, enabled=1, internal=0, flags=0) at ../../src/gdb/breakpoint.c:9275 #3 0x0000555555bb9d15 in mi_cmd_break_insert_1 (dprintf=0, command=0x5555567e6fd0 "break-insert", argv=0x5555567e7070, argc=3) at ../../src/gdb/mi/mi-cmd-break.c:366 #4 0x0000555555bb9e15 in mi_cmd_break_insert (command=0x5555567e6fd0 "break-insert", argv=0x5555567e7070, argc=3) at ../../src/gdb/mi/mi-cmd-break.c:383 ... This commit fixes it by adding an input validation check to mi_cmd_break_insert_1, similar to how we validate global thread numbers for "-p THREAD", just a few lines above. gdb.mi/mi-thread-specific-bp.exp already exercises the similar case for thread-specific breakpoints. Extended it to test inferior-specific breakpoints too. In the GDB manual, describe that the inferior passed to `-g` must be valid, exactly like commit 00cdd79a5d ("gdb/mi: check thread exists when creating thread-specific b/p") did for `-p THREAD` Change-Id: Ibde0d4d098bf0b5d7b057e818a77a63c84806a3c commit-id:b791b7ee --- I propose renaming the testcase to gdb.mi/mi-thread-inferior-specific-bp.exp, but I'm not doing it in this patch, as by default git diff isn't able to detect that this would be a rename + modifications, instead presenting the diff as a delete + new file. Change-Id: I468e62bfb02e85d97bd43c54ea8c2e4532972434 commit-id:15849578 --- gdb/doc/gdb.texinfo | 3 +- gdb/inferior.c | 9 ++ gdb/inferior.h | 3 + gdb/mi/mi-cmd-break.c | 3 + .../gdb.mi/mi-thread-specific-bp.exp | 88 +++++++++++++------ 5 files changed, 76 insertions(+), 30 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index ab0216ff477..435265bd74f 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -33515,7 +33515,8 @@ time the breakpoint is requested. Breakpoints created with a thread exits. @item -g @var{thread-group-id} Restrict the breakpoint to the thread group with the specified -@var{thread-group-id}. +@var{thread-group-id}. @var{thread-group-id} must be a valid +thread-group-id at the time the breakpoint is requested. @item --qualified This option makes @value{GDBN} interpret a function name specified as a complete fully-qualified name. diff --git a/gdb/inferior.c b/gdb/inferior.c index 1481f46cdd1..931115f46c1 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -389,6 +389,15 @@ find_inferior_id (int num) return NULL; } +/* See inferior.h. */ + +bool +valid_inferior_id (int num) +{ + inferior *inf = find_inferior_id (num); + return inf != nullptr; +} + struct inferior * find_inferior_pid (process_stratum_target *targ, int pid) { diff --git a/gdb/inferior.h b/gdb/inferior.h index 9c031035a23..a483e60a7ef 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -754,6 +754,9 @@ extern struct inferior *find_inferior_ptid (process_stratum_target *targ, /* Search function to lookup an inferior by GDB 'num'. */ extern struct inferior *find_inferior_id (int num); +/* Return true if inferior NUM exists, false otherwise. */ +extern bool valid_inferior_id (int num); + /* Find an inferior bound to PSPACE, giving preference to the current inferior. */ extern struct inferior * diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c index 1771e5208af..2231e90c192 100644 --- a/gdb/mi/mi-cmd-break.c +++ b/gdb/mi/mi-cmd-break.c @@ -29,6 +29,7 @@ #include "location.h" #include "linespec.h" #include "tracepoint.h" +#include "inferior.h" enum { @@ -248,6 +249,8 @@ mi_cmd_break_insert_1 (int dprintf, const char *command, break; case THREAD_GROUP_OPT: thread_group = mi_parse_thread_group_id (oarg); + if (!valid_inferior_id (thread_group)) + error (_("Unknown thread-group %d."), thread_group); break; case PENDING_OPT: pending = 1; diff --git a/gdb/testsuite/gdb.mi/mi-thread-specific-bp.exp b/gdb/testsuite/gdb.mi/mi-thread-specific-bp.exp index 9f250912b2c..53a0c7878d0 100644 --- a/gdb/testsuite/gdb.mi/mi-thread-specific-bp.exp +++ b/gdb/testsuite/gdb.mi/mi-thread-specific-bp.exp @@ -13,8 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# This test is for creating thread-specific breakpoint using the MI, -# and checking the results from GDB. +# Create thread- and inferior-specific breakpoints using the MI, and +# check the results from GDB. load_lib mi-support.exp set MIFLAGS "-i=mi" @@ -29,16 +29,41 @@ if {[build_executable ${testfile}.exp ${binfile} ${srcfile}]} { return -1 } -proc make_loc {num} { - return [mi_make_breakpoint_loc -thread "1" -number "$::decimal\\.$num"] +# SPECIFICITY_KIND can be "inferior" or "thread". +proc make_loc {specificity_kind num} { + return [mi_make_breakpoint_loc -$specificity_kind "1" -number "$::decimal\\.$num"] } -proc do_test { mode } { +# Return the -break-insert option for inserting a breakpoint that is +# specific to NUM, of SPECIFICITY_KIND kind. +proc make_opt {specificity_kind num} { + if { $specificity_kind == "thread" } { + return "-p $num" + } elseif { $specificity_kind == "inferior" } { + return "-g i$num" + } else { + error "unknown specificity kind $specificity_kind" + } +} + +# Convert SPECIFICITY_KIND to the corresponding MI attribute. +proc as_mi_kind {specificity_kind} { + if { $specificity_kind == "inferior" } { + return "thread-group" + } else { + return $specificity_kind + } +} - # Ensure we get an error when placing a b/p for thread 1 at a point - # where thread 1 doesn't exist. - mi_gdb_test "-break-insert -p 1 bar" \ - "\\^error,msg=\"Unknown thread 1\\.\"" +proc do_test { mode specificity_kind } { + + if { $specificity_kind == "thread" } { + # Ensure we get an error when placing a b/p for thread 1 at a + # point where thread 1 doesn't exist. This test doesn't make + # sense for inferior-specific breakpoints. + mi_gdb_test "-break-insert -p 1 bar" \ + "\\^error,msg=\"Unknown thread 1\\.\"" + } # If we have a separate CLI UI then run the 'info breakpoints' # command. There was a time when the previous breakpoint request @@ -55,20 +80,22 @@ proc do_test { mode } { return -1 } - # Ensure we get an error when placing a b/p for a thread that doesn't - # exist (when other threads do exist). - mi_gdb_test "-break-insert -p 999 bar" \ - "\\^error,msg=\"Unknown thread 999\\.\"" + # Ensure we get an error when placing a b/p for a thread/inferior + # that doesn't exist. + mi_gdb_test "-break-insert [make_opt $specificity_kind 999] bar" \ + "\\^error,msg=\"Unknown [as_mi_kind $specificity_kind] 999\\.\"" - mi_create_breakpoint "-p 1 bar" "thread-specific b/p on bar" \ - -thread "1" + mi_create_breakpoint "[make_opt $specificity_kind 1] bar" \ + "inferior-specific b/p on bar" \ + -$specificity_kind "1" - set loc1 [make_loc 1] - set loc2 [make_loc 2] - set loc3 [make_loc 3] + set loc1 [make_loc $specificity_kind 1] + set loc2 [make_loc $specificity_kind 2] + set loc3 [make_loc $specificity_kind 3] - mi_create_breakpoint_multi "-p 1 foo" "thread-specific b/p on foo" \ - -thread "1" \ + mi_create_breakpoint_multi "[make_opt $specificity_kind 1] foo" \ + "$specificity_kind-specific b/p on foo" \ + -$specificity_kind "1" \ -locations "\\\[$loc1,$loc2,$loc3\\\]" # Check that 'info breakpoints' on the CLI succeeds. @@ -90,17 +117,20 @@ foreach_mi_ui_mode mode { set start_ops "" } - if {[mi_clean_restart $::testfile $start_ops]} { - break - } + foreach_with_prefix specificity_kind {"inferior" "thread" } { - set res [do_test $mode] + if {[mi_clean_restart $::testfile $start_ops]} { + break + } + + set res [do_test $mode $specificity_kind] - # mi_clean_restart and gdb_finish call gdb_exit, which doesn't work for - # separate-mi-tty. Use mi_gdb_exit instead. - mi_gdb_exit + # mi_clean_restart and gdb_finish call gdb_exit, which doesn't + # work for separate-mi-tty. Use mi_gdb_exit instead. + mi_gdb_exit - if { $res == -1 } { - break + if { $res == -1 } { + break + } } } base-commit: 8c0ac471835ec86a67c5b42713d9f138f31e4014 -- 2.53.0