Extended-remote exec test
authorDon Breazeal <donb@codesourcery.com>
Fri, 11 Sep 2015 18:06:02 +0000 (11:06 -0700)
committerDon Breazeal <donb@codesourcery.com>
Fri, 11 Sep 2015 18:12:46 +0000 (11:12 -0700)
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.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/foll-exec.c
gdb/testsuite/gdb.base/foll-exec.exp
gdb/testsuite/gdb.base/foll-vfork.exp
gdb/testsuite/gdb.base/pie-execl.exp
gdb/testsuite/gdb.threads/non-ldr-exc-1.exp
gdb/testsuite/gdb.threads/non-ldr-exc-2.exp
gdb/testsuite/gdb.threads/non-ldr-exc-3.exp
gdb/testsuite/gdb.threads/non-ldr-exc-4.exp

index 1538d152f1e5fc119c5c111e18b5774029771801..7753bdb47ef88229242af72883db19da9a7a2c2d 100644 (file)
@@ -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.
index 6e302bb8ce3c8565e3ae2a12204747138a225d6b..77287a45c2055ddababb97e3b28faf9709de884b 100644 (file)
@@ -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");
 
index 5bea3badc049e419fb6dbe34f206d36c06f8891a..0a6347c82fd2b0e2d0f0533f27abc7ad514dbc30 100644 (file)
@@ -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
 }
@@ -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
    }
 
@@ -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
    }
 
@@ -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
    }
 
@@ -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
    }
 
@@ -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
    }
 
@@ -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
    }
 
@@ -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
index b94b7ea7bc14bf4d0a5b8bc10f6ddf21c2236f3c..78c5cc82245b9b8449f3f7387a0a34fb1817de42 100644 (file)
@@ -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
index 182f96f7eda34aa0e394879c11000f8e61714ad0..51edc821df24a79aaabef08e55650c35ef681bc0 100644 (file)
@@ -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
 }
@@ -67,6 +70,7 @@ 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
@@ -74,8 +78,24 @@ gdb_test_multiple $test $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
+       }
     }
 }
 
index 69e5cc6b1292e1a06c280c98e2334b3861a09f66..d3a9601540ee21105d1f66fb484a2b6a3bbfe574 100644 (file)
@@ -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
@@ -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
+  }
+}
index 9386153b8e30343662603dbef1aefca7d0e7f7ca..8b170ec48eba8b452962a9e16f9dc415a597a77f 100644 (file)
@@ -29,11 +29,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
@@ -42,6 +45,10 @@ proc do_test { lock_sched } {
        gdb_breakpoint [gdb_get_line_number "break-here"]
        gdb_continue_to_breakpoint "break-here" ".* break-here .*"
 
+       if { $nonstop == "on" } {
+           gdb_test "thread 2" "Switching.*"
+       }
+
        gdb_test "info threads" \
            "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \
            "single thread left"
@@ -59,5 +66,12 @@ proc do_test { lock_sched } {
     }
 }
 
-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
+  }
+}
index cc7da1a750efd9ecafa648e2fdae9e8f1e9a3222..3e7a3a1295b85c0ea8051bf1852920c14838f910 100644 (file)
@@ -31,18 +31,25 @@ 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
        }
 
        gdb_breakpoint [gdb_get_line_number "break-here"]
-       gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+       gdb_test_multiple "continue" "continue to breakpoint" {
+           -re ".*Breakpoint.*break-here.*" {
+               pass "continue to breakpoint"
+           }
+       }
 
        # Also test with sched-lock to make sure we can follow the
        # non-leader thread execing even though the main thread wasn't
@@ -51,11 +58,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
+  }
+}
index a89b818b6d0164fd093961c2e9418cff578747e3..4d7e97ad5a1690a1fcfeba65374c3a0e5f6e485b 100644 (file)
@@ -30,11 +30,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
@@ -50,11 +53,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
+  }
+}