diff options
author | Joel Brobecker <brobecker@gnat.com> | 2012-10-24 18:19:50 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2012-10-24 18:19:50 +0000 |
commit | b9a7f6edfa283f15e3f58a2f955e3f30a8f7af56 (patch) | |
tree | 5b60215411d3d3646874cbba0c3cc41a598e473e /gdb/ravenscar-thread.c | |
parent | 7fce6a4fa3ed7553aa8454666bfe896e605f7e53 (diff) | |
download | gdb-b9a7f6edfa283f15e3f58a2f955e3f30a8f7af56.tar.gz |
remote packet sent after Ravenscar inferior exited
When debugging a program using the Ravenscar profile, the debugger
sometimes tries to send the following packet to the remote after
the inferior exited.
(gdb) c
Continuing.
[...]
Sending packet: $vCont;c:1#13...Ack
Packet received: W00
Sending packet: $Hg1#e0...putpkt: write failed: Broken pipe.
As the inferior exited, the remote has already disconnected, and thus
the operation fails.
The reason why GDB sends the package is because the ravenscar-thread
module tries to updates the list of threads. But this doesn't make
sense, since the program has exited. This patch fixes it.
gdb/ChangeLog:
* ravenscar-thread.c (ravenscar_wait): Only update the list
of threads and inferior_ptid if the inferior is still alive.
Diffstat (limited to 'gdb/ravenscar-thread.c')
-rw-r--r-- | gdb/ravenscar-thread.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c index 385438175a2..0c475cbd2d1 100644 --- a/gdb/ravenscar-thread.c +++ b/gdb/ravenscar-thread.c @@ -204,8 +204,19 @@ ravenscar_wait (struct target_ops *ops, ptid_t ptid, inferior_ptid = base_ptid; beneath->to_wait (beneath, base_ptid, status, 0); - ravenscar_find_new_threads (ops); - ravenscar_update_inferior_ptid (); + /* Find any new threads that might have been created, and update + inferior_ptid to the active thread. + + Only do it if the program is still alive, though. Otherwise, + this causes problems when debugging through the remote protocol, + because we might try switching threads (and thus sending packets) + after the remote has disconnected. */ + if (status->kind != TARGET_WAITKIND_EXITED + && status->kind != TARGET_WAITKIND_SIGNALLED) + { + ravenscar_find_new_threads (ops); + ravenscar_update_inferior_ptid (); + } return inferior_ptid; } |