aboutsummaryrefslogtreecommitdiff
path: root/gdb/ravenscar-thread.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2012-10-24 18:19:50 +0000
committerJoel Brobecker <brobecker@gnat.com>2012-10-24 18:19:50 +0000
commitbed0c2439825684b1f7a34bcc2e49acfafe3bb4c (patch)
tree2f1bac571897fbea3ea5e7df497ab7fefdbe31e2 /gdb/ravenscar-thread.c
parentf69c91ad24e3704234ffde45557fc5edddd7af8a (diff)
downloadgdb-bed0c2439825684b1f7a34bcc2e49acfafe3bb4c.zip
gdb-bed0c2439825684b1f7a34bcc2e49acfafe3bb4c.tar.gz
gdb-bed0c2439825684b1f7a34bcc2e49acfafe3bb4c.tar.bz2
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.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 3854381..0c475cb 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;
}