From patchwork Wed Oct 14 15:27:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 9129 Received: (qmail 2105 invoked by alias); 14 Oct 2015 15:36:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 1989 invoked by uid 89); 14 Oct 2015 15:36:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 14 Oct 2015 15:36:36 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 4E2BC8E709 for ; Wed, 14 Oct 2015 15:28:19 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t9EFS6Dk016846 for ; Wed, 14 Oct 2015 11:28:18 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 11/18] gdbserver: fix killed-outside.exp Date: Wed, 14 Oct 2015 16:27:59 +0100 Message-Id: <1444836486-25679-12-git-send-email-palves@redhat.com> In-Reply-To: <1444836486-25679-1-git-send-email-palves@redhat.com> References: <1444836486-25679-1-git-send-email-palves@redhat.com> killed-outside.exp regresses with "maint set target-non-stop on". The logs show: (gdb) continue Continuing. infrun: clear_proceed_status_thread (Thread 9028.9028) infrun: proceed (addr=0xffffffffffffffff, signal=GDB_SIGNAL_DEFAULT) infrun: proceed: resuming Thread 9028.9028 Sending packet: $Z0,3615a03966,1#4b... Notification received: Stop:X9;process:2344 Packet received: E01 Sending packet: $Z0,3615a13970,1#47...Packet received: E01 Sending packet: $Z0,3615a14891,1#4a...Packet received: E01 infrun: resume (step=0, signal=GDB_SIGNAL_0), trap_expected=0, current thread [Thread 9028.9028] at 0x4005e4 Sending packet: $vCont;c:p2344.2344#1a...Packet received: E.target not running. Sending packet: $qXfer:threads:read::0,fff#03...Packet received: l\n\n Sending packet: $vStopped#55...Packet received: OK Unexpected vCont reply in non-stop mode: E.target not running. (gdb) remote_async_inferior_event_handler infrun: target_wait (-1.0.0, status) = infrun: 9028.0.0 [process 9028], infrun: status->kind = signalled, signal = GDB_SIGNAL_KILL infrun: TARGET_WAITKIND_SIGNALLED Program terminated with signal SIGKILL, Killed. The program no longer exists. infrun: stop_waiting infrun: clear_step_over_info infrun: stop_all_threads remote_thread_exit_events(1) Note the "Unexpected vCont reply" error. I traced it to a problem in status_pending_p_callback. It resumes an LWP when it shouldn't. gdb/gdbserver/ChangeLog: 2015-10-14 Pedro Alves * linux-low.c (thread_still_has_status_pending_p): Don't check vCont;t here. (lwp_resumed): New function. (status_pending_p_callback): Return early if the LWP is not supposed to be resumed. --- gdb/gdbserver/linux-low.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 1c447c2..af9ca22 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -1535,12 +1535,6 @@ thread_still_has_status_pending_p (struct thread_info *thread) if (!lp->status_pending_p) return 0; - /* If we got a `vCont;t', but we haven't reported a stop yet, do - report any status pending the LWP may have. */ - if (thread->last_resume_kind == resume_stop - && thread->last_status.kind != TARGET_WAITKIND_IGNORE) - return 0; - if (thread->last_resume_kind != resume_stop && (lp->stop_reason == TARGET_STOPPED_BY_SW_BREAKPOINT || lp->stop_reason == TARGET_STOPPED_BY_HW_BREAKPOINT)) @@ -1597,6 +1591,24 @@ thread_still_has_status_pending_p (struct thread_info *thread) return 1; } +/* Returns true if LWP is resumed from the client's perspective. */ + +static int +lwp_resumed (struct lwp_info *lwp) +{ + struct thread_info *thread = get_lwp_thread (lwp); + + if (thread->last_resume_kind != resume_stop) + return 1; + + /* Did we get a `vCont;t', but we haven't reported a stop yet? */ + if (thread->last_resume_kind == resume_stop + && thread->last_status.kind == TARGET_WAITKIND_IGNORE) + return 1; + + return 0; +} + /* Return 1 if this lwp has an interesting status pending. */ static int status_pending_p_callback (struct inferior_list_entry *entry, void *arg) @@ -1610,6 +1622,9 @@ status_pending_p_callback (struct inferior_list_entry *entry, void *arg) if (!ptid_match (ptid_of (thread), ptid)) return 0; + if (!lwp_resumed (lp)) + return 0; + if (lp->status_pending_p && !thread_still_has_status_pending_p (thread)) {