Skip to content

Commit

Permalink
Extended-remote exec test
Browse files Browse the repository at this point in the history
This patch updates several exec-related tests and some of the library
functions in order to get them running with extended-remote.  There were
three changes that were required, as follows:

In gdb.base/foll-exec.exp, use 'clean_start' in place of proc 'zap_session'
to reset the state of the debugger between tests.  This sets 'remote
exec-file' to execute the correct binary file in each subsequent test.

In gdb.base/pie-execl.exp, there is an expect statement with an expression
that is used to match output from both gdb and the program under debug.
For the remote target, this had to be split into two expressions, using
$inferior_spawn_id to match the output from the program.

Because I had encountered problems with extended-remote exec events in
non-stop mode in my manual testing, I added non-stop testing to the
non-ldr-exc-[1234].exp tests.  In order to set non-stop mode for remote
targets, it is necessary to 'set non-stop on' after gdb has started, but
before it connects to gdbserver.  This is done using 'save_vars' to set
non-stop mode in GDBFLAGS, so GDB sets non-stop mode on startup.

gdb/testsuite/ChangeLog:

	* gdb.base/foll-exec.c: Add copyright header.  Fix
	formatting issues.
	* gdb.base/foll-exec.exp (zap_session): Delete proc.
	(do_exec_tests): Use clean_restart in place of zap_session,
	and for test initialization.  Fix formatting issues.  Use
	fail in place of perror.
	* gdb.base/pie-execl.exp (main): Use 'inferior_spawn_id' in
	an expect statement to match an expression with output from
	the program under debug.
	* gdb.threads/non-ldr-exc-1.exp (do_test, main): Add
	non-stop tests and pass stop mode argument to clean_restart.
	Use save_vars to enable non-stop in GDBFLAGS.
	* gdb.threads/non-ldr-exc-2.exp: Likewise.
	* gdb.threads/non-ldr-exc-3.exp: Likewise.
	* gdb.threads/non-ldr-exc-4.exp: Likewise.
  • Loading branch information
donb1999 committed Sep 11, 2015
1 parent d46addb commit 2fd33e9
Show file tree
Hide file tree
Showing 9 changed files with 178 additions and 103 deletions.
17 changes: 17 additions & 0 deletions gdb/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
2015-09-11 Don Breazeal <donb@codesourcery.com>

* gdb.base/foll-exec.c: Add copyright header. Fix
formatting issues.
* gdb.base/foll-exec.exp (zap_session): Delete proc.
(do_exec_tests): Use clean_restart in place of zap_session,
and for test initialization. Fix formatting issues. Use
fail in place of perror.
* gdb.base/pie-execl.exp (main): Use 'inferior_spawn_id' in
an expect statement to match an expression with output from
the program under debug.
* gdb.threads/non-ldr-exc-1.exp (do_test, main): Add
non-stop tests and use save_vars to enable non-stop in GDBFLAGS.
* gdb.threads/non-ldr-exc-2.exp: Likewise.
* gdb.threads/non-ldr-exc-3.exp: Likewise.
* gdb.threads/non-ldr-exc-4.exp: Likewise.

2015-09-09 Doug Evans <dje@google.com>

* gdb.python/py-prettyprint.exp: Check result of run_lang_tests.
Expand Down
44 changes: 30 additions & 14 deletions gdb/testsuite/gdb.base/foll-exec.c
Original file line number Diff line number Diff line change
@@ -1,36 +1,52 @@
/* This test program is part of GDB, the GNU debugger.
Copyright 1997-2015 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>


int global_i = 100;
int global_i = 100;

int main (void)
{
int local_j = global_i+1;
int local_k = local_j+1;
int local_j = global_i + 1;
int local_k = local_j + 1;

printf ("foll-exec is about to execlp(execd-prog)...\n");

execlp (BASEDIR "/execd-prog",
BASEDIR "/execd-prog",
"execlp arg1 from foll-exec",
(char *)0);
BASEDIR "/execd-prog",
"execlp arg1 from foll-exec",
(char *) 0);

printf ("foll-exec is about to execl(execd-prog)...\n");

execl (BASEDIR "/execd-prog", /* tbreak-execl */
BASEDIR "/execd-prog",
"execl arg1 from foll-exec",
"execl arg2 from foll-exec",
(char *)0);
BASEDIR "/execd-prog",
"execl arg1 from foll-exec",
"execl arg2 from foll-exec",
(char *) 0);

{
static char * argv[] = {
(char *)BASEDIR "/execd-prog",
(char *)"execv arg1 from foll-exec",
(char *)0};
(char *) BASEDIR "/execd-prog",
(char *) "execv arg1 from foll-exec",
(char *) 0};

printf ("foll-exec is about to execv(execd-prog)...\n");

Expand Down
65 changes: 16 additions & 49 deletions gdb/testsuite/gdb.base/foll-exec.exp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# This is a test of gdb's ability to follow a process through a
# Unix exec() system call.

if { [is_remote target] || ![isnative] } then {
continue
}
Expand Down Expand Up @@ -44,44 +47,14 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $com
return -1
}

proc zap_session {} {
global gdb_prompt
global binfile

send_gdb "kill\n"
gdb_expect {
-re ".*Kill the program being debugged.*y or n. $" {
gdb_test_no_output "y" ""
send_gdb "file $binfile\n"
gdb_expect {
-re ".*Load new symbol table from.*y or n. $" {
send_gdb "y\n"
gdb_expect {
-re "Reading symbols from.*$gdb_prompt $" {}
timeout { fail "loading symbols (timeout)"; return }
}
}
-re ".*gdb_prompt $" {}
timeout { fail "loading symbols (timeout)"; return }
}
}
-re ".*$gdb_prompt $" {}
timeout { fail "killing inferior (timeout)" ; return }
}
}

proc do_exec_tests {} {
global binfile srcfile srcfile2 testfile testfile2
global gdb_prompt
global binfile
global srcfile
global srcfile2
global testfile
global testfile2

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile}"
fail "Couldn't run ${testfile}"
return
}

Expand All @@ -103,12 +76,12 @@ proc do_exec_tests {} {
return
}

zap_session
clean_restart $binfile

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile}"
fail "Couldn't run ${testfile}"
return
}

Expand Down Expand Up @@ -192,12 +165,12 @@ proc do_exec_tests {} {

# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
zap_session
clean_restart $binfile

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile} (2nd try)"
fail "Couldn't run ${testfile} (2nd try)"
return
}

Expand Down Expand Up @@ -265,12 +238,12 @@ proc do_exec_tests {} {

# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
zap_session
clean_restart $binfile

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile} (3rd try)"
fail "Couldn't run ${testfile} (3rd try)"
return
}

Expand Down Expand Up @@ -326,12 +299,12 @@ proc do_exec_tests {} {

# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
zap_session
clean_restart $binfile

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile} (4th try)"
fail "Couldn't run ${testfile} (4th try)"
return
}

Expand Down Expand Up @@ -381,12 +354,12 @@ proc do_exec_tests {} {

# Explicitly kill this program, or a subsequent rerun actually runs
# the exec'd program, not the original program...
zap_session
clean_restart $binfile

# Start the program running, and stop at main.
#
if ![runto_main] then {
perror "Couldn't run ${testfile} (5th try)"
fail "Couldn't run ${testfile} (5th try)"
return
}

Expand All @@ -406,14 +379,8 @@ proc do_exec_tests {} {
# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

clean_restart $binfile

# This is a test of gdb's ability to follow a process through a
# Unix exec() system call.
#
do_exec_tests

return 0
29 changes: 12 additions & 17 deletions gdb/testsuite/gdb.base/foll-vfork.exp
Original file line number Diff line number Diff line change
Expand Up @@ -524,23 +524,18 @@ with_test_prefix "check vfork support" {
check_vfork_catchpoints
}

# There is no support for exec events in the RSP yet.
if { ![gdb_is_target_remote] } {
# Follow parent and follow child vfork tests with a child that execs.
with_test_prefix "exec" {
# These are tests of gdb's ability to follow the parent of a Unix
# vfork system call. The child will subsequently call a variant
# of the Unix exec system call.
do_vfork_and_follow_parent_tests

# These are tests of gdb's ability to follow the child of a Unix
# vfork system call. The child will subsequently call a variant
# of a Unix exec system call.
#
do_vfork_and_follow_child_tests_exec
}
} else {
unsupported "vfork with exec: exec events not supported for remote"
# Follow parent and follow child vfork tests with a child that execs.
with_test_prefix "exec" {
# These are tests of gdb's ability to follow the parent of a Unix
# vfork system call. The child will subsequently call a variant
# of the Unix exec system call.
do_vfork_and_follow_parent_tests

# These are tests of gdb's ability to follow the child of a Unix
# vfork system call. The child will subsequently call a variant
# of a Unix exec system call.
#
do_vfork_and_follow_child_tests_exec
}

# Switch to test the case of the child exiting. We can't use
Expand Down
24 changes: 22 additions & 2 deletions gdb/testsuite/gdb.base/pie-execl.exp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
# The problem was due to amd64_skip_prologue attempting to access inferior
# memory before the PIE (Position Independent Executable) gets relocated.

global inferior_spawn_id
global gdb_spawn_id

if ![istarget *-linux*] {
continue
}
Expand Down Expand Up @@ -67,15 +70,32 @@ gdb_test_multiple "p/x &pie_execl_marker" $test {
verbose -log "addr1 is $addr1"

set test "continue"
set matches_found 0
gdb_test_multiple $test $test {
-re "Error in re-setting breakpoint" {
fail $test
}
-re "Cannot access memory" {
fail $test
}
-re "pie-execl: re-exec.*executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
pass $test
-i "$inferior_spawn_id" -re "pie-execl: re-exec" {
# output from inferior
incr matches_found
if { $matches_found == 2 } {
pass $test
} else {
exp_continue
}
}
-i "$gdb_spawn_id"
-re "executing new program.*\r\nBreakpoint \[0-9\]+,\[^\r\n\]* pie_execl_marker .*\r\n$gdb_prompt $" {
# output from gdb
incr matches_found
if { $matches_found == 2 } {
pass $test
} else {
exp_continue
}
}
}

Expand Down
24 changes: 19 additions & 5 deletions gdb/testsuite/gdb.threads/non-ldr-exc-1.exp
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,14 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
return -1
}

proc do_test { lock_sched } {
with_test_prefix "lock-sched$lock_sched" {
proc do_test { lock_sched nonstop } {
with_test_prefix "lock-sched=$lock_sched,non-stop=$nonstop" {
global executable

clean_restart ${executable}
save_vars { GDBFLAGS } {
append GDBFLAGS " -ex \"set non-stop $nonstop\""
clean_restart ${executable}
}

if ![runto_main] {
return -1
Expand All @@ -48,11 +51,22 @@ proc do_test { lock_sched } {
gdb_test_no_output "set scheduler-locking on"
}

if { $nonstop == "on" } {
gdb_test "thread 2" "Switching.*"
}

gdb_test "continue" \
".*is executing new program.*Breakpoint 1, main.* at .*" \
"continue over exec"
}
}

do_test 0
do_test 1
foreach nonstop {"on" "off"} {
foreach schedlock {"on" "off"} {
if {$schedlock == "on" && $nonstop == "on"} {
# Schedule locking has no effect in nonstop mode.
continue
}
do_test $schedlock $nonstop
}
}
Loading

0 comments on commit 2fd33e9

Please sign in to comment.