This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 2/3] Get GDBserver pid on remote target
- From: Pedro Alves <palves at redhat dot com>
- To: Yao Qi <yao at codesourcery dot com>, gdb-patches at sourceware dot org
- Date: Wed, 08 Oct 2014 15:07:28 +0100
- Subject: Re: [PATCH 2/3] Get GDBserver pid on remote target
- Authentication-results: sourceware.org; auth=none
- References: <543404EF dot 4010306 at redhat dot com> <1412749679-27076-1-git-send-email-yao at codesourcery dot com> <1412749679-27076-3-git-send-email-yao at codesourcery dot com>
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