diff options
author | Jan Matyas <jmatyas@codasip.com> | 2021-02-25 08:27:09 +0100 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2021-02-25 15:38:54 -0500 |
commit | 64d38fdd9956aefd1f0fbeb7e1d2774e71c0a9b8 (patch) | |
tree | b0934299c4e2f443f62620865a50eb117b7a25bb /gdb/remote.c | |
parent | e38332c286bb96026fadc128170303cc4e935225 (diff) | |
download | fsf-binutils-gdb-64d38fdd9956aefd1f0fbeb7e1d2774e71c0a9b8.zip fsf-binutils-gdb-64d38fdd9956aefd1f0fbeb7e1d2774e71c0a9b8.tar.gz fsf-binutils-gdb-64d38fdd9956aefd1f0fbeb7e1d2774e71c0a9b8.tar.bz2 |
Fix initial thread state of non-threaded remote targets
This change fixes the initial state of the main thread of remote
targets which have no concept of threading. Such targets are
treated as single-threaded by gdb, and this single thread needs
to be initially set to the "resumed" state, in the same manner as
threads in thread-aware remote targets (see remote.c,
remote_target::remote_add_thread).
Without this fix, the following assert was triggered on thread-
unaware remote targets:
remote_target::select_thread_for_ambiguous_stop_reply(const target_waitstatus*): Assertion `first_resumed_thread != nullptr' failed.
The bug can be reproduced using gdbserver
* by disabling packets 'T' and 'qThreadInfo', or
* by disabling all thread-related packets.
The test suite has been updated to include these two scenarios, see
gdb.server/stop-reply-no-thread.exp.
Change-Id: I2c39c9de17e8d6922a8c1b9e259eb316a554a43d
Diffstat (limited to 'gdb/remote.c')
-rw-r--r-- | gdb/remote.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/gdb/remote.c b/gdb/remote.c index 2c85bdc..ae15f41 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -741,7 +741,7 @@ public: /* Remote specific methods. */ int remote_resume_with_vcont (ptid_t ptid, int step, gdb_signal siggnal); - void add_current_inferior_and_thread (const char *wait_status); + thread_info *add_current_inferior_and_thread (const char *wait_status); ptid_t wait_ns (ptid_t ptid, struct target_waitstatus *status, target_wait_flags options); @@ -4409,9 +4409,11 @@ remote_target::get_current_thread (const char *wait_status) whose response is a stop reply from which we can also try extracting the thread. If the target doesn't support the explicit qC query, we infer the current thread from that stop reply, passed - in in WAIT_STATUS, which may be NULL. */ + in in WAIT_STATUS, which may be NULL. -void + The function returns pointer to the main thread of the inferior. */ + +thread_info * remote_target::add_current_inferior_and_thread (const char *wait_status) { struct remote_state *rs = get_remote_state (); @@ -4445,6 +4447,8 @@ remote_target::add_current_inferior_and_thread (const char *wait_status) yet. */ thread_info *tp = add_thread_silent (this, curr_ptid); switch_to_thread_no_regs (tp); + + return tp; } /* Print info about a thread that was found already stopped on @@ -4800,7 +4804,8 @@ remote_target::start_remote (int from_tty, int extended_p) /* Target has no concept of threads at all. GDB treats non-threaded target as single-threaded; add a main thread. */ - add_current_inferior_and_thread (wait_status); + thread_info *tp = add_current_inferior_and_thread (wait_status); + get_remote_thread_info (tp)->set_resumed (); } else { |