This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[commit] remote packet sent after Ravenscar inferior exited


Hello,

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.

Checked in.

---
 gdb/ChangeLog          |    5 +++++
 gdb/ravenscar-thread.c |   15 +++++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a4dd74e..be3bb1c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2012-10-24  Joel Brobecker  <brobecker@adacore.com>
 
+	* 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  <brobecker@adacore.com>
+
 	* ada-lang.c (is_known_support_routine): Use lbasename when
 	matching the symtab's filename against
 	known_runtime_file_name_patterns.
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;
 }
 
-- 
1.7.9.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]