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 | bed0c2439825684b1f7a34bcc2e49acfafe3bb4c (patch) | |
tree | 2f1bac571897fbea3ea5e7df497ab7fefdbe31e2 /gdb/ravenscar-thread.c | |
parent | f69c91ad24e3704234ffde45557fc5edddd7af8a (diff) | |
download | gdb-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.c | 15 |
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; } |