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

Re: [PATCH 2/3] Get GDBserver pid on remote target


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


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