From 835205d078aa3b78180da1512f8019ab064032e7 Mon Sep 17 00:00:00 2001 From: Gary Benson Date: Tue, 12 May 2015 11:57:52 +0100 Subject: [PATCH] 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. --- 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 b58f04ab5e..7f4b45724d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2015-05-12 Gary Benson + + * 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 * NEWS (Python Scripting): Mention the new gdb.Value methods. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 727d0ad05e..05aeab788c 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-05-12 Gary Benson + + * gdb.texinfo (General Query Packets): Document + qXfer:exec-file:read with empty annex. + 2015-05-09 Siva Chandra Reddy * python.texi (Values From Inferior): Add descriptions of new diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 19d8bb3893..5461356bd8 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 c33f90a10c..94146b8f48 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2015-05-12 Gary Benson + + * server.c (handle_qxfer_exec_file): Use current process + if annex is empty. + 2015-05-08 Sandra Loosemore * linux-nios2-low.c: Include elf/common.h. Adjust comments. diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 3f9bb8938d..174ab398b0 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 3b2325f861..02c83711b6 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 (¤t_target, TARGET_OBJECT_EXEC_FILE, annex); -- 2.34.1