Get GDBserver pid on remote target
authorYao Qi <yao@codesourcery.com>
Tue, 30 Sep 2014 13:08:15 +0000 (21:08 +0800)
committerYao Qi <yao@codesourcery.com>
Sat, 11 Oct 2014 03:13:34 +0000 (11:13 +0800)
Hi,
We see the following fail in the real remote testing...

(gdb) Executing on target: kill -9 29808    (timeout = 300)
spawn [open ...]^M
sh: 1: kill: No such process

The test tries to kill gdbserver in this way:

set server_pid [exp_pid -i [board_info target fileid]]
remote_exec target "kill -9 $server_pid"

in native testing, we'll get the pid of spawned gdbserver, however, in
remote testing, we'll get the pid of ssh session, since we start
gdbserver on the remote target through ssh.  The pid on build doesn't
exist on target.

In this patch, we tweak server-kill.c to get the parent pid, which is
the pid of GDBserver.  GDB gets it and kill GDBserver on target.

gdb/testsuite:

2014-10-11  Yao Qi  <yao@codesourcery.com>

* gdb.server/server-kill.c: Include sys/types.h and unistd.h.
(main): Call getppid.
* gdb.server/server-kill.exp: Set breakpoint on line "i = 0;"
and continue to it.  Read variable "server_pid".

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.server/server-kill.c
gdb/testsuite/gdb.server/server-kill.exp

index 23eea6bf81f0b3d089009daafa752af31852c5ff..14e2d5c0858b8552ac118f681159b460d058a844 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-11  Yao Qi  <yao@codesourcery.com>
+
+       * gdb.server/server-kill.c: Include sys/types.h and unistd.h.
+       (main): Call getppid.
+       * gdb.server/server-kill.exp: Set breakpoint on line "i = 0;"
+       and continue to it.  Read variable "server_pid".
+
 2014-10-11  Yao Qi  <yao@codesourcery.com>
 
        * gdb.server/server-kill.exp: Remove "delete_breakpoints".
index 8a7c74e737ef7a5b6b0ccb161f5cbb5a3b8d2090..8369024bd861893b59742f9e7335d5d2b6eeafe7 100644 (file)
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
+#include <sys/types.h>
+#include <unistd.h>
+
+int server_pid;
+
 int
 main (void)
 {
-  int i = 0;
+  int i;
+
+  server_pid = getppid ();
+  i = 0;
 
   return i;
 }
index b23c2b54d7f79c3c44a9b55688ffb155b7f66a4c..83c11f2d0d4885c7d2700c904da0da5e0f2cc2a2 100644 (file)
@@ -33,7 +33,23 @@ gdb_test "disconnect" ".*"
 
 gdbserver_run ""
 
-set server_pid [exp_pid -i [board_info target fileid]]
+# Continue past server_pid assignment.
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "i = 0;"]
+gdb_continue_to_breakpoint "after server_pid assignment"
+
+# Get the pid of GDBServer.
+set test "p server_pid"
+gdb_test_multiple $test $test {
+    -re " = ($decimal)\r\n$gdb_prompt $" {
+       set server_pid $expect_out(1,string)
+       pass $test
+    }
+}
+
+if {$server_pid == "" } {
+    return -1
+}
+
 remote_exec target "kill -9 $server_pid"
 
 # Force GDB to talk with GDBserver, so that we can get the