From bed0c2439825684b1f7a34bcc2e49acfafe3bb4c Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Wed, 24 Oct 2012 18:19:50 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 5 +++++ gdb/ravenscar-thread.c | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a4dd74e135c..be3bb1c2aa5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-10-24 Joel Brobecker + + * ravenscar-thread.c (ravenscar_wait): Only update the list + of threads and inferior_ptid if the inferior is still alive. + 2012-10-24 Joel Brobecker * ada-lang.c (is_known_support_routine): Use lbasename when 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; } -- 2.30.2