From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 118631 invoked by alias); 11 Jan 2020 10:20:39 -0000 Mailing-List: contact gdb-testers-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-testers-owner@sourceware.org Received: (qmail 118616 invoked by uid 89); 11 Jan 2020 10:20:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-15.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=get_offsets X-HELO: kwanyin.sergiodj.net Received: from kwanyin.sergiodj.net (HELO kwanyin.sergiodj.net) (158.69.185.54) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 11 Jan 2020 10:20:38 +0000 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [binutils-gdb] Fix reconnecting to a gdbserver already debugging multiple processes, II From: gdb-buildbot@sergiodj.net To: gdb-testers@sourceware.org Message-Id: <75c6c844d9df37761e0e834df057b89e41816e55@gdb-build> Date: Sat, 11 Jan 2020 10:20:00 -0000 X-SW-Source: 2020-q1/txt/msg00980.txt *** TEST RESULTS FOR COMMIT 75c6c844d9df37761e0e834df057b89e41816e55 *** commit 75c6c844d9df37761e0e834df057b89e41816e55 Author: Pedro Alves AuthorDate: Fri Jan 10 20:05:54 2020 +0000 Commit: Pedro Alves CommitDate: Fri Jan 10 20:05:54 2020 +0000 Fix reconnecting to a gdbserver already debugging multiple processes, II Another bug exposed by gdb.server/extended-remote-restart.exp in the multi-target work is that remote_target::start_remote can leave inferior_ptid and current_inferior() out of sync: (top-gdb) p current_inferior_->pid $1 = 29541 (top-gdb) p inferior_ptid $2 = {m_pid = 29540, m_lwp = 29540, m_tid = 0} This is caused by writing to inferior_ptid directly instead of using switch_to_thread. Also, "inferior_list->thread_list->ptid" assumes that we want the first thread of the first inferior, but that inferior may not have threads, or with multi-target, that target may be connected to some other target. gdb/ChangeLog: 2020-01-10 Pedro Alves * remote.c (remote_target::start_remote): Don't set inferior_ptid directly. Instead find the first thread in the thread list and use switch_to_thread. diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4163c869af..a6fd8b11cd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2020-01-10 Pedro Alves + + * remote.c (remote_target::start_remote): Don't set inferior_ptid + directly. Instead find the first thread in the thread list and + use switch_to_thread. + 2020-01-10 Pedro Alves * remote.c (remote_target::remote_add_inferior): Don't bind a diff --git a/gdb/remote.c b/gdb/remote.c index 751769ea7f..f017f4a719 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -4701,8 +4701,8 @@ remote_target::start_remote (int from_tty, int extended_p) says should be current. If we're reconnecting to a multi-threaded program, this will ideally be the thread that last reported an event before GDB disconnected. */ - inferior_ptid = get_current_thread (wait_status); - if (inferior_ptid == null_ptid) + ptid_t curr_thread = get_current_thread (wait_status); + if (curr_thread == null_ptid) { /* Odd... The target was able to list threads, but not tell us which thread was current (no "thread" @@ -4714,8 +4714,14 @@ remote_target::start_remote (int from_tty, int extended_p) "warning: couldn't determine remote " "current thread; picking first in list.\n"); - inferior_ptid = inferior_list->thread_list->ptid; + for (thread_info *tp : all_non_exited_threads ()) + { + switch_to_thread (tp); + break; + } } + else + switch_to_thread (find_thread_ptid (curr_thread)); } /* init_wait_for_inferior should be called before get_offsets in order