Access executable from remote system when first inferior appears
authorGary Benson <gbenson@redhat.com>
Fri, 17 Apr 2015 08:47:30 +0000 (09:47 +0100)
committerGary Benson <gbenson@redhat.com>
Fri, 17 Apr 2015 08:47:30 +0000 (09:47 +0100)
This commit modifies remote_add_inferior to take an extra argument
try_open_exec.  If this is nonzero, remote_add_inferior will attempt
to open this inferior's executable as the main executable if no main
executable is open already.  Callers are updated appropriately.

With this commit, remote debugging can now be initiated using only a
"target remote" or "target extended-remote" command; no "set sysroot"
or "file" commands are required, e.g.

  bash$ gdb -q
  (gdb) target remote | gdbserver - /bin/sh
  Remote debugging using | gdbserver - /bin/sh
  Process /bin/sh created; pid = 32166
  stdin/stdout redirected
  Remote debugging using stdio
  Reading symbols from target:/bin/bash...

One testcase required updating as a result of this commit.  The test
checked that GDB's "info files" command does not crash if no main
executable is open, and relied on GDB's inability to access the main
executable over the remote protocol.  The test was updated to inhibit
this new behavior.

gdb/ChangeLog:

* remote.c (remote_add_inferior): New argument try_open_exec.
If nonzero, attempt to open the inferior's executable file as
the main executable if no main executable is open already.
All callers updated.
* NEWS: Mention that GDB now supports automatic location and
retrieval of executable + files from remote targets.

gdb/doc/ChangeLog:

* gdb.texinfo (Connecting to a Remote Target): Mention that
GDB can access program files from remote targets that support
qXfer:exec-file:read and Host I/O packets.

gdb/testsuite/ChangeLog:

* gdb.server/server-exec-info.exp: Inhibit GDB from accessing
the main executable over the remote protocol.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/remote.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.server/server-exec-info.exp

index 8f4c86ae341b4609c61ef28fa426b4767dcd045f..4478d819658ad98a436c10645d2a1c78d0925596 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-17  Gary Benson <gbenson@redhat.com>
+
+       * remote.c (remote_add_inferior): New argument try_open_exec.
+       If nonzero, attempt to open the inferior's executable file as
+       the main executable if no main executable is open already.
+       All callers updated.
+       * NEWS: Mention that GDB now supports automatic location and
+       retrieval of executable + files from remote targets.
+
 2015-04-17  Gary Benson <gbenson@redhat.com>
 
        * target.h (TARGET_OBJECT_EXEC_FILE): New enum value.
index b11a6fc2879c9be248f3db975a553636ab53a717..62cbdcb944102bb3b41d8e871c12e8cbacd4a1cc 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
   the operating system) when starting processes remotely, and when
   attaching to already-running local or remote processes.
 
+* GDB now supports automatic location and retrieval of executable
+  files from remote targets.  Remote debugging can now be initiated
+  using only a "target remote" or "target extended-remote" command
+  (no "set sysroot" or "file" commands are required).  See "New remote
+  packets" below.
+
 * Python Scripting
 
   ** gdb.Objfile objects have a new attribute "username",
index 1bb7f41988c43dd4abf64a7ba5693d9c4fbf77fb..2335bc1f339b6987858b4ab35794ac7769f90d57 100644 (file)
@@ -1,3 +1,9 @@
+2015-04-17  Gary Benson <gbenson@redhat.com>
+
+       * gdb.texinfo (Connecting to a Remote Target): Mention that
+       GDB can access program files from remote targets that support
+       qXfer:exec-file:read and Host I/O packets.
+
 2015-04-17  Gary Benson <gbenson@redhat.com>
 
        * gdb.texinfo (Remote Configuration): Document the "set/show
index 964f9c48932e9ef62f2793f6f713f81f36ca290b..04107026328d05e04e11fc58bd4f1f1fcbc69894 100644 (file)
@@ -18952,10 +18952,15 @@ configuration of @value{GDBN}; use @code{help target} to list them.
 @node Connecting
 @section Connecting to a Remote Target
 
-On the @value{GDBN} host machine, you will need an unstripped copy of
-your program, since @value{GDBN} needs symbol and debugging information.
-Start up @value{GDBN} as usual, using the name of the local copy of your
-program as the first argument.
+@value{GDBN} needs an unstripped copy of your program to access symbol
+and debugging information.  Some remote targets (@pxref{qXfer
+executable filename read}, and @pxref{Host I/O Packets}) allow
+@value{GDBN} to access program files over the same connection used to
+communicate with @value{GDBN}.  With such a target, if the remote
+program is unstripped, the only command you need is @code{target
+remote}.  Otherwise, start up @value{GDBN} using the name of the local
+unstripped copy of your program as the first argument, or use the
+@code{file} command.
 
 @cindex @code{target remote}
 @value{GDBN} can communicate with the target over a serial line, or
index a4b82e8a447d52d52a41e88ed630b70c02c83403..3b2325f86155e12809f434c494c545e6c9a00055 100644 (file)
@@ -1516,10 +1516,13 @@ remote_query_attached (int pid)
    inferior.  If ATTACHED is 1, then we had just attached to this
    inferior.  If it is 0, then we just created this inferior.  If it
    is -1, then try querying the remote stub to find out if it had
-   attached to the inferior or not.  */
+   attached to the inferior or not.  If TRY_OPEN_EXEC is true then
+   attempt to open this inferior's executable as the main executable
+   if no main executable is open already.  */
 
 static struct inferior *
-remote_add_inferior (int fake_pid_p, int pid, int attached)
+remote_add_inferior (int fake_pid_p, int pid, int attached,
+                    int try_open_exec)
 {
   struct inferior *inf;
 
@@ -1553,6 +1556,11 @@ remote_add_inferior (int fake_pid_p, int pid, int attached)
   inf->attach_flag = attached;
   inf->fake_pid_p = fake_pid_p;
 
+  /* 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)
+    exec_file_locate_attach (pid, 1);
+
   return inf;
 }
 
@@ -1643,7 +1651,7 @@ remote_notice_new_inferior (ptid_t currthread, int running)
          int fake_pid_p = !remote_multi_process_p (rs);
 
          inf = remote_add_inferior (fake_pid_p,
-                                    ptid_get_pid (currthread), -1);
+                                    ptid_get_pid (currthread), -1, 1);
        }
 
       /* This is really a new thread.  Add it.  */
@@ -3413,7 +3421,7 @@ add_current_inferior_and_thread (char *wait_status)
       fake_pid_p = 1;
     }
 
-  remote_add_inferior (fake_pid_p, ptid_get_pid (inferior_ptid), -1);
+  remote_add_inferior (fake_pid_p, ptid_get_pid (inferior_ptid), -1, 1);
 
   /* Add the main thread.  */
   add_thread_silent (inferior_ptid);
@@ -4539,7 +4547,7 @@ extended_remote_attach (struct target_ops *target, const char *args,
             target_pid_to_str (pid_to_ptid (pid)));
     }
 
-  set_current_inferior (remote_add_inferior (0, pid, 1));
+  set_current_inferior (remote_add_inferior (0, pid, 1, 0));
 
   inferior_ptid = pid_to_ptid (pid);
 
index 2000dbed2c7993b4424cc33b4a83bb6184dd9337..500a77409b67f50078b944e4b49bddcedbed97ee 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-17  Gary Benson <gbenson@redhat.com>
+
+       * gdb.server/server-exec-info.exp: Inhibit GDB from accessing
+       the main executable over the remote protocol.
+
 2015-04-16  Pedro Alves  <palves@redhat.com>
 
        * boards/native-extended-gdbserver.exp (mi_gdb_start): Don't start
index ca5f5caaa33d218d12bd6a8d168085e4a6d21469..c12554afe8176dc6bf4ecc101105cb11a561ef8e 100644 (file)
@@ -27,6 +27,7 @@ if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] {
     return -1
 }
 
+gdb_test_no_output "set remote pid-to-exec-file-packet off"
 gdb_test "file" ".*" "file" \
         {Discard symbol table from `.*'\? \(y or n\) } "y"
 gdbserver_run ""