diff --git a/gdb/remote.c b/gdb/remote.c index 991a4344c7f..eb537fc48a5 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -8415,6 +8415,11 @@ remote_target::process_stop_reply (struct stop_reply *stop_reply, /* Expedited registers. */ if (!stop_reply->regcache.empty ()) { + /* 'w' stop replies don't cary expedited registers (which + wouldn't make any sense for a thread that is gone + already). */ + gdb_assert (status->kind () != TARGET_WAITKIND_THREAD_EXITED); + struct regcache *regcache = get_thread_arch_regcache (this, ptid, stop_reply->arch); @@ -8599,7 +8604,7 @@ remote_target::wait_as (ptid_t ptid, target_waitstatus *status, again. Keep waiting for events. */ rs->waiting_for_stop_reply = 1; break; - case 'N': case 'T': case 'S': case 'X': case 'W': + case 'N': case 'T': case 'S': case 'X': case 'W': case 'w': { /* There is a stop reply to handle. */ rs->waiting_for_stop_reply = 0; diff --git a/gdbserver/server.cc b/gdbserver/server.cc index 2a70ca63cbd..4a312da40bc 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -3045,6 +3045,7 @@ resume (struct thread_resume *actions, size_t num_actions) if (cs.last_status.kind () != TARGET_WAITKIND_EXITED && cs.last_status.kind () != TARGET_WAITKIND_SIGNALLED + && cs.last_status.kind () != TARGET_WAITKIND_THREAD_EXITED && cs.last_status.kind () != TARGET_WAITKIND_NO_RESUMED) current_thread->last_status = cs.last_status;