Fix reconnecting to a gdbserver already debugging multiple processes, II
authorPedro Alves <palves@redhat.com>
Fri, 10 Jan 2020 20:05:54 +0000 (20:05 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 10 Jan 2020 20:05:54 +0000 (20:05 +0000)
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  <palves@redhat.com>

* 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.

gdb/ChangeLog
gdb/remote.c

index 4163c869afed4c1f63b140240b8b21ebdb42ddac..a6fd8b11cd2f488c416fa5fbdda64930742326dc 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-10  Pedro Alves  <palves@redhat.com>
+
+       * 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  <palves@redhat.com>
 
        * remote.c (remote_target::remote_add_inferior): Don't bind a
index 751769ea7fc517013a3931df7ef0452a321f61d8..f017f4a719c6c1d508633ac5fdde3b7b2394016a 100644 (file)
@@ -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