From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id AV7cM0nc+GmoHRMAWB0awg (envelope-from ) for ; Mon, 04 May 2026 13:50:01 -0400 Received: by simark.ca (Postfix, from userid 112) id CC5431E067; Mon, 04 May 2026 13:50:01 -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 476141E067 for ; Mon, 04 May 2026 13:50:00 -0400 (EDT) Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 680CE4BAD173 for ; Mon, 4 May 2026 17:49:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 680CE4BAD173 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by sourceware.org (Postfix) with ESMTPS id BA3F44BABF32 for ; Mon, 4 May 2026 17:49:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BA3F44BABF32 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 BA3F44BABF32 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777916963; cv=none; b=iw/m5H/R4BV0AkElWJ1rLu9AZLQbUmkYAsF++LojK752ULRjpQzOKhEqar/bAw42rcVQFAd0FJUGvlkbY75BhzbL/mbXBgn3oiZW5AshOpNMaFjTvSuZpNMrGv0A6nbMGK3fcOifCw4TMqoHJTV3dG7ZH22XrEfzZUjKCG5uYis= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777916963; c=relaxed/simple; bh=I51sR+UeUMMUitCIH3kCGEHAAcX01fRk3chpWNUpDLQ=; h=Message-ID:Date:MIME-Version:Subject:To:From; b=MOPcRaBEdZc6gDrTOI3AcPf8EDN3mafp5nsJvVaaWAwf6VZAsjw1Oyp3aAuYt8+nnj84IIislllwueknrJuhTUZaTicAoAx23H4+F65oDmyvJXW2NXdXPmwgtZ2PTw4zDu6JowimF55rA47hVIW8Bdb9Bq4zyH5FmfEghtUpOys= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BA3F44BABF32 Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-44e1ebb3122so616126f8f.2 for ; Mon, 04 May 2026 10:49:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916962; x=1778521762; h=content-transfer-encoding:in-reply-to:content-language:from :references:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=6e9Im4qLKl+l+gzZZt2XriugSlNaJQPcnuIVThtcBGY=; b=MX7IJRQYYcBNJhAm7t8E9RiceGtedTY1OWec/4B9pXZ8a6PXly+5SwIFuXumfk6Rh9 edYUwU2YZMStt0ijR1J22KSVme5YxKZ2s2iTGMQqOAXzC0I8hGBQVLTZMvGkTQF965Ke y6+HJPIkgNKZiMqihGPeala+t/1pxxM0TUriqyaQDS1yQiKEsh8pf5+fufXWgUBryxxl uQM0yC73YQTKhUhIqmf3Xa6u+b9U11phvOKXANWbyNU5lV8Z8soMDprddn9GYZmi49Zk 328uWzgiXBARr2gzHUGwbQsCfhaOSgGknkKWvCL/KNB8OThYPCgWlrbahFd1G27+IQoj ix2w== X-Forwarded-Encrypted: i=1; AFNElJ8kb9OU/UBCHq2tif2/gQSffvoE4kt43GDUe0zd1w6ufA5jvuom67kFmVlYkz0bkUP5FGhM0+bN1LiN+w==@sourceware.org X-Gm-Message-State: AOJu0Ywkls3J+LAANl2bQhH53tHzCvt8K6aKCdNd6qkITaa4mfL6vgkb uN8LYzsYvhka+k8zoO+d4o6yQfltZofVPFWcichc6WI2akmP5897rjdn X-Gm-Gg: AeBDieuaVwmRdLQ6gGQKpUTP7EQ2q1qMN/Q7295OtsHqQaB48aYxVmu4xHCIm+jJV8P 6GqqZrJQZNdVnw9biqOKa89GPheSmnqvkPWHxFGM8SvdieMHU6iAhFroMZNQ6V6VjoT4rWB+1hB WzyNJcscUPGO2Ktddm4eeKvCp0Z/fmmEJZ9PKqVujJxBVg9iaEj9G1syYnqju6Qfljr8dMWARk0 PjWPgZ5UTHUpCI3JPunMgi0trk7/+Bgi/8J+2ZUJ4ypXHCgmln89ULOC0eOBRp268ZzYK8JF0fu 0ciw/PpVv76vdGjGt6OWMaMRIFWxhJlMA+ZN5c4fZALZAOIK59JEOK91j1TqHFJHyMnZqnhrN6c uigBaTJx9lqoxmjzu8K1y2Fr6nRaisC3jj2wSDRR57kps0HbQEc3KC/DOeoFm/KYiolCs+L6TmB ltU3Pycf3SIEL22KgMhKs5gi1BlGmbp2UoVtukH9ksJVvRWJyzkMGE0IJrHK5iDpDRGUN7z7n6O 4K2 X-Received: by 2002:a05:6000:184e:b0:43d:762e:76c6 with SMTP id ffacd0b85a97d-44bb3207ae6mr18291108f8f.7.1777916961419; Mon, 04 May 2026 10:49:21 -0700 (PDT) Received: from ?IPV6:2001:8a0:facb:a800:f625:f0b7:9de7:360b? ([2001:8a0:facb:a800:f625:f0b7:9de7:360b]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-44a986aa70dsm28211059f8f.25.2026.05.04.10.49.20 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 04 May 2026 10:49:20 -0700 (PDT) Message-ID: <94e4c888-cde1-4551-9cd8-170a11fa9074@palves.net> Date: Mon, 4 May 2026 18:49:19 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v2] Fix MI "-break-insert -g i" assertion failure To: Simon Marchi , gdb-patches@sourceware.org References: <20260504145242.1253541-1-pedro@palves.net> <15ed223f-5dcf-4e9d-927b-cdbfcbe57ae3@simark.ca> From: Pedro Alves Content-Language: en-US In-Reply-To: <15ed223f-5dcf-4e9d-927b-cdbfcbe57ae3@simark.ca> Content-Type: text/plain; charset=UTF-8 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 Hi! On 2026-05-04 17:22, Simon Marchi wrote: > On 5/4/26 10:52 AM, Pedro Alves wrote: >> 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 > > Is this "commit-id" trailer on purpose? Yes, it's for "git spr". > > It confused "b4 shazam", because when I applied the patch locally it > converted it to: > > commit-id:b791b7ee > > Change-Id: Ibde0d4d098bf0b5d7b057e818a77a63c84806a3c > Reviewed-By: Eli Zaretskii > > Maybe it's the lack of space after the colon. Could well be. git spr used to be picky until very recently and use (and require) the non-standard format with no space. That was fixed very recently, I'll look into rebasing my fork to pick the fix. > > The patch LGTM, I noted some minor comments below. > > Approved-By: Simon Marchi > >> 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; >> +} > > IMO you can get rid of the inf variable (but it's fine if it was a > conscious choice, sometimes intermediate variables make debugging > easier because that gives you something to print). I don't mind either way. I'll change it. > >> +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\\.\"" >> + } > > The comment above is not clear to me. Does this mean to test adding a > thread specific breakpoints when _no_ threads exist at all? Yes, I think so. > Because > below we have another similar test, but when threads exist. If so, the > comment could say "at a point where threads don't exist" instead of > "where thread 1 doesn't exist". And then I would understand why it > doesn't make sense for inferiors: because there is always at least one > inferior. Done. > >> @@ -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 > > Not a big deal but: I guess those "break"s were meant to exist the test > case completely when something goes wrong? Now, with the nested for > loops, it won't do that. We typically don't do that, unless we know for > a fact that letting the test run after some failure will cause lengthy, > cascading failures. > I think we should just remove the early break. We always clean-restart for each iteration, so it's not a case of cascading failures. Here's a v2 with those changes. >From 7942a0a716a9c05e69f24cde39c32b20d2dfad24 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 9 Apr 2025 14:29:53 +0100 Subject: [PATCH v2] Fix MI "-break-insert -g i" assertion failure 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 | 8 ++ gdb/inferior.h | 3 + gdb/mi/mi-cmd-break.c | 3 + .../gdb.mi/mi-thread-specific-bp.exp | 85 ++++++++++++------- 5 files changed, 72 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..c0596b96158 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -389,6 +389,14 @@ find_inferior_id (int num) return NULL; } +/* See inferior.h. */ + +bool +valid_inferior_id (int num) +{ + return find_inferior_id (num) != 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..9213c55adc5 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,42 @@ 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" + } +} - # 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\\.\"" +# 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 + } +} + +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 no threads exist yet. This test doesn't make + # sense for inferior-specific breakpoints, as there is always + # at least one inferior. + 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 +81,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 +118,16 @@ 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 + } - # 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 + do_test $mode $specificity_kind - if { $res == -1 } { - break + # 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 } } base-commit: 8c0ac471835ec86a67c5b42713d9f138f31e4014 -- 2.53.0