[2/3] Get GDBserver pid on remote target

Message ID 1412749679-27076-3-git-send-email-yao@codesourcery.com
State New, archived
Headers

Commit Message

Yao Qi Oct. 8, 2014, 6:27 a.m. UTC
  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-08  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/gdb.server/server-kill.c   | 10 +++++++++-
 gdb/testsuite/gdb.server/server-kill.exp | 17 ++++++++++++++++-
 2 files changed, 25 insertions(+), 2 deletions(-)
  

Comments

Pedro Alves Oct. 8, 2014, 2:07 p.m. UTC | #1
On 10/08/2014 07:27 AM, Yao Qi wrote:
> 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-08  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/gdb.server/server-kill.c   | 10 +++++++++-
>  gdb/testsuite/gdb.server/server-kill.exp | 17 ++++++++++++++++-
>  2 files changed, 25 insertions(+), 2 deletions(-)
> 
> diff --git a/gdb/testsuite/gdb.server/server-kill.c b/gdb/testsuite/gdb.server/server-kill.c
> index 8a7c74e..8369024b 100644
> --- a/gdb/testsuite/gdb.server/server-kill.c
> +++ b/gdb/testsuite/gdb.server/server-kill.c
> @@ -15,10 +15,18 @@
>     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;
>  }
> diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp
> index b23c2b5..0f808a9 100644
> --- a/gdb/testsuite/gdb.server/server-kill.exp
> +++ b/gdb/testsuite/gdb.server/server-kill.exp
> @@ -33,7 +33,22 @@ 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
> +    }
> +    -re "$gdb_prompt $" {
> +	fail $test
> +	return -1
> +    }
> +}

If gdb_test_multiple catches an internal error, or a timeout, this
won't return, and below we'll end up using $server_pid without it
being set.  So please do the usual (also note "GDBserver" typo):

# Get GDBserver's pid.

set server_pid ""
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
}

This is OK with that change.

I think mingw doesn't have getppid; so as is this will be losing
coverage there.  gnulib doesn't appear to have something we could borrow,
unfortunately.  I think we could emulate it with NtQueryInformationProcess,
but it's fine with me to leave it for another pass.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/gdb.server/server-kill.c b/gdb/testsuite/gdb.server/server-kill.c
index 8a7c74e..8369024b 100644
--- a/gdb/testsuite/gdb.server/server-kill.c
+++ b/gdb/testsuite/gdb.server/server-kill.c
@@ -15,10 +15,18 @@ 
    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;
 }
diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp
index b23c2b5..0f808a9 100644
--- a/gdb/testsuite/gdb.server/server-kill.exp
+++ b/gdb/testsuite/gdb.server/server-kill.exp
@@ -33,7 +33,22 @@  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
+    }
+    -re "$gdb_prompt $" {
+	fail $test
+	return -1
+    }
+}
 remote_exec target "kill -9 $server_pid"
 
 # Force GDB to talk with GDBserver, so that we can get the