This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Locate executables on remote stubs without multiprocess extensions


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

commit 835205d078aa3b78180da1512f8019ab064032e7
Author: Gary Benson <gbenson@redhat.com>
Date:   Tue May 12 11:57:52 2015 +0100

    Locate executables on remote stubs without multiprocess extensions
    
    This commit allows GDB to determine filenames of main executables
    when debugging using remote stubs without multiprocess extensions.
    The qXfer:exec-file:read packet is extended to allow an empty
    annex, with the meaning that the remote stub should supply the
    filename of whatever it thinks is the current process.
    
    gdb/ChangeLog:
    
    	* remote.c (remote_add_inferior): Call exec_file_locate_attach
    	for fake PIDs as well as real ones.
    	(remote_pid_to_exec_file): Send empty annex if PID is fake.
    
    gdb/doc/ChangeLog:
    
    	* gdb.texinfo (General Query Packets): Document
    	qXfer:exec-file:read with empty annex.
    
    gdb/gdbserver/ChangeLog:
    
    	* server.c (handle_qxfer_exec_file): Use current process
    	if annex is empty.

Diff:
---
 gdb/ChangeLog           |  6 ++++++
 gdb/doc/ChangeLog       |  5 +++++
 gdb/doc/gdb.texinfo     |  3 ++-
 gdb/gdbserver/ChangeLog |  5 +++++
 gdb/gdbserver/server.c  | 25 ++++++++++++++++++++-----
 gdb/remote.c            | 19 ++++++++++++++++---
 6 files changed, 54 insertions(+), 9 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b58f04a..7f4b457 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-05-12  Gary Benson <gbenson@redhat.com>
+
+	* remote.c (remote_add_inferior): Call exec_file_locate_attach
+	for fake PIDs as well as real ones.
+	(remote_pid_to_exec_file): Send empty annex if PID is fake.
+
 2015-05-09  Siva Chandra Reddy  <sivachandra@google.com>
 
 	* NEWS (Python Scripting): Mention the new gdb.Value methods.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 727d0ad..05aeab7 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-12  Gary Benson <gbenson@redhat.com>
+
+	* gdb.texinfo (General Query Packets): Document
+	qXfer:exec-file:read with empty annex.
+
 2015-05-09  Siva Chandra Reddy  <sivachandra@google.com>
 
 	* python.texi (Values From Inferior): Add descriptions of new
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 19d8bb3..5461356 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -36558,7 +36558,8 @@ by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
 Return the full absolute name of the file that was executed to create
 a process running on the remote system.  The annex specifies the
 numeric process ID of the process to query, encoded as a hexadecimal
-number.
+number.  If the annex part is empty the remote stub should return the
+filename corresponding to the currently executing process.
 
 This packet is not probed by default; the remote stub must request it,
 by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index c33f90a..94146b8 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,8 @@
+2015-05-12  Gary Benson <gbenson@redhat.com>
+
+	* server.c (handle_qxfer_exec_file): Use current process
+	if annex is empty.
+
 2015-05-08  Sandra Loosemore  <sandra@codesourcery.com>
 
 	* linux-nios2-low.c: Include elf/common.h.  Adjust comments.
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 3f9bb89..174ab39 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1146,17 +1146,32 @@ handle_qxfer_exec_file (const char *const_annex,
 			gdb_byte *readbuf, const gdb_byte *writebuf,
 			ULONGEST offset, LONGEST len)
 {
-  char *annex, *file;
+  char *file;
   ULONGEST pid;
   int total_len;
 
   if (the_target->pid_to_exec_file == NULL || writebuf != NULL)
     return -2;
 
-  annex = alloca (strlen (const_annex) + 1);
-  strcpy (annex, const_annex);
-  annex = unpack_varlen_hex (annex, &pid);
-  if (annex[0] != '\0' || pid == 0)
+  if (const_annex[0] == '\0')
+    {
+      if (current_thread == NULL)
+	return -1;
+
+      pid = pid_of (current_thread);
+    }
+  else
+    {
+      char *annex = alloca (strlen (const_annex) + 1);
+
+      strcpy (annex, const_annex);
+      annex = unpack_varlen_hex (annex, &pid);
+
+      if (annex[0] != '\0')
+	return -1;
+    }
+
+  if (pid <= 0)
     return -1;
 
   file = (*the_target->pid_to_exec_file) (pid);
diff --git a/gdb/remote.c b/gdb/remote.c
index 3b2325f..02c8371 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -1558,7 +1558,7 @@ remote_add_inferior (int fake_pid_p, int pid, int attached,
 
   /* If no main executable is currently open then attempt to
      open the file that was executed to create this inferior.  */
-  if (try_open_exec && !fake_pid_p && get_exec_file (0) == NULL)
+  if (try_open_exec && get_exec_file (0) == NULL)
     exec_file_locate_attach (pid, 1);
 
   return inf;
@@ -11666,7 +11666,8 @@ static char *
 remote_pid_to_exec_file (struct target_ops *self, int pid)
 {
   static char *filename = NULL;
-  char annex[9];
+  struct inferior *inf;
+  char *annex = NULL;
 
   if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE)
     return NULL;
@@ -11674,7 +11675,19 @@ remote_pid_to_exec_file (struct target_ops *self, int pid)
   if (filename != NULL)
     xfree (filename);
 
-  xsnprintf (annex, sizeof (annex), "%x", pid);
+  inf = find_inferior_pid (pid);
+  if (inf == NULL)
+    internal_error (__FILE__, __LINE__,
+		    _("not currently attached to process %d"), pid);
+
+  if (!inf->fake_pid_p)
+    {
+      const int annex_size = 9;
+
+      annex = alloca (annex_size);
+      xsnprintf (annex, annex_size, "%x", pid);
+    }
+
   filename = target_read_stralloc (&current_target,
 				   TARGET_OBJECT_EXEC_FILE, annex);


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