From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 0C29E3848030 for ; Wed, 17 Mar 2021 15:14:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 0C29E3848030 Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 12HFEDoQ024228 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 17 Mar 2021 11:14:18 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 12HFEDoQ024228 Received: from [10.0.0.11] (192-222-157-6.qc.cable.ebox.net [192.222.157.6]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 801D41E54D; Wed, 17 Mar 2021 11:14:13 -0400 (EDT) Subject: Re: [PATCH 1/3] Fix any_thread_of_inferior To: Pedro Alves , gdb-patches@sourceware.org References: <20210315234339.457551-1-pedro@palves.net> <20210315234339.457551-2-pedro@palves.net> From: Simon Marchi Message-ID: <3867f8a5-70df-5a0e-350e-291ee0116a7d@polymtl.ca> Date: Wed, 17 Mar 2021 11:14:13 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <20210315234339.457551-2-pedro@palves.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Wed, 17 Mar 2021 15:14:13 +0000 X-Spam-Status: No, score=-10.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Mar 2021 15:14:22 -0000 On 2021-03-15 7:43 p.m., Pedro Alves wrote: > Running gdb-term.exp against gdbserver with "maint set target-non-stop > on", runs into this: > > [infrun] fetch_inferior_event: exit > [infrun] fetch_inferior_event: enter > /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:72: internal-error: thread_info* inferior_thread(): Assertion `current_thread_ != nullptr' failed. > A problem internal to GDB has been detected, > further debugging may prove unreliable. > > This is a bug, please report it. For instructions, see: > . > > FAIL: gdb.base/gdb-sigterm.exp: expect eof #2 (GDB internal error) > Resyncing due to internal error. > ERROR: : spawn id exp9 not open > while executing > "expect { > -i exp9 -timeout 10 > -re "Quit this debugging session\\? \\(y or n\\) $" { > send_gdb "n\n" answer > incr count > } > -re "Create ..." > ("uplevel" body line 1) > invoked from within > "uplevel $body" NONE : spawn id exp9 not open > ERROR: Could not resync from internal error (timeout) > gdb.base/gdb-sigterm.exp: expect eof #2: stepped 0 times > UNRESOLVED: gdb.base/gdb-sigterm.exp: 50 SIGTERM passes > > The assertion fails here: > > ... > #5 0x000055af4b4a7164 in internal_error (file=0x55af4b5e5de8 "/home/pedro/gdb/binutils-gdb/src/gdb/thread.c", line=72, fmt=0x55af4b5e5ce9 "%s: Assertion `%s' failed.") at /home/pedro/gdb/binutils-gdb/src/gdbsupport/errors.cc:55 > #6 0x000055af4b25fc43 in inferior_thread () at /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:72 > #7 0x000055af4b26177e in any_thread_of_inferior (inf=0x55af4cf874f0) at /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:638 > #8 0x000055af4b26eec8 in kill_or_detach (inf=0x55af4cf874f0, from_tty=0) at /home/pedro/gdb/binutils-gdb/src/gdb/top.c:1665 > #9 0x000055af4b26f37f in quit_force (exit_arg=0x0, from_tty=0) at /home/pedro/gdb/binutils-gdb/src/gdb/top.c:1767 > #10 0x000055af4b2f72a7 in quit () at /home/pedro/gdb/binutils-gdb/src/gdb/utils.c:633 > #11 0x000055af4b2f730b in maybe_quit () at /home/pedro/gdb/binutils-gdb/src/gdb/utils.c:657 > #12 0x000055af4b1adb74 in ser_base_wait_for (scb=0x55af4d02e460, timeout=0) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:236 > #13 0x000055af4b1adf0f in do_ser_base_readchar (scb=0x55af4d02e460, timeout=0) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:365 > #14 0x000055af4b1ae06d in generic_readchar (scb=0x55af4d02e460, timeout=0, do_readchar=0x55af4b1adeb1 ) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:444 > ... > > The bug is that any_thread_of_inferior incorrectly assumes that > there's always a selected thread. This fixes it. > > gdb/ChangeLog: > > * thread.c (any_thread_of_inferior): Check if there's a selected > thread before calling inferior_thread(). > > Change-Id: Ica4b9ec746121a7a7c22bef09baea72103b3853d > --- > gdb/thread.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/gdb/thread.c b/gdb/thread.c > index 3e7d6e14bf7..fc6db96fbcb 100644 > --- a/gdb/thread.c > +++ b/gdb/thread.c > @@ -637,8 +637,8 @@ any_thread_of_inferior (inferior *inf) > { > gdb_assert (inf->pid != 0); > > - /* Prefer the current thread. */ > - if (inf == current_inferior ()) > + /* Prefer the current thread, if there's one. */ > + if (inf == current_inferior () && inferior_ptid != null_ptid) > return inferior_thread (); > > for (thread_info *tp : inf->non_exited_threads ()) > Makes sense. current_thread_ is always supposed to be in sync with inferior_ptid because we are always supposed to use switch_to_thread or similar function to switch thread, right? Simon