[binutils-gdb] GDB: Work around D; PID handling bug in older GDBservers (PR gdb/23377)

Pedro Alves palves@sourceware.org
Wed Jul 11 22:36:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4c7333b308f5178813745f40e641231efb1cb763

commit 4c7333b308f5178813745f40e641231efb1cb763
Author: Pedro Alves <palves@redhat.com>
Date:   Wed Jul 11 23:31:44 2018 +0100

    GDB: Work around D;PID handling bug in older GDBservers (PR gdb/23377)
    
    This commit adds a GDB workaround for the GDBserver bug exposed by
    commit f2ffa92bbce9 ("gdb: Eliminate the 'stop_pc' global"), so that
    newer GDBs can continue working with older GDBservers.
    
    gdb/ChangeLog:
    2018-07-11  Pedro Alves  <palves@redhat.com>
    
    	PR gdb/23377
    	* remote.c (remote_target::remote_detach_pid): Call
    	set_current_process.

Diff:
---
 gdb/ChangeLog | 6 ++++++
 gdb/remote.c  | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c82c37e..9b920c4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
 2018-07-11  Pedro Alves  <palves@redhat.com>
 
+	PR gdb/23377
+	* remote.c (remote_target::remote_detach_pid): Call
+	set_current_process.
+
+2018-07-11  Pedro Alves  <palves@redhat.com>
+
 	* h8300-tdep.c (h8300_gdbarch_init): Remove
 	set_gdbarch_ecoff_reg_to_regnum calls.
 
diff --git a/gdb/remote.c b/gdb/remote.c
index 297c198..a81d67e 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -5661,6 +5661,14 @@ remote_target::remote_detach_pid (int pid)
 {
   struct remote_state *rs = get_remote_state ();
 
+  /* This should not be necessary, but the handling for D;PID in
+     GDBserver versions prior to 8.2 incorrectly assumes that the
+     selected process points to the same process we're detaching,
+     leading to misbehavior (and possibly GDBserver crashing) when it
+     does not.  Since it's easy and cheap, work around it by forcing
+     GDBserver to select GDB's current process.  */
+  set_general_process ();
+
   if (remote_multi_process_p (rs))
     xsnprintf (rs->buf, get_remote_packet_size (), "D;%x", pid);
   else



More information about the Gdb-cvs mailing list