diff mbox

[16/16,v2] Non-stop follow exec tests

Message ID 1408580964-27916-17-git-send-email-donb@codesourcery.com
State New
Headers show

Commit Message

Don Breazeal Aug. 21, 2014, 12:29 a.m. UTC
This patch modifies some follow-exec tests, getting one to work with
extended-remote targets and extending another for more coverage.

First, gdb.base/foll-exec.exp is changed to use clean_restart for
the initial test startup and to replace the proc zap_session
everywhere in the test.  This provides for extended-remote targets
to be able to do runto_main.

The functionality is changed slightly by this, in that zap_session
did not exit and restart the debugger as clean_restart does.
However, none of the tests are checking for the interaction of
follow-exec with re-running the program, so the functionality is
tested in the same way.

The other change extends the non-ldr-exc-*.exp tests so that they run all
their cases in non-stop mode as well as all-stop mode.  These tests cover
handling of exec events when non-leader threads call exec.

The tests now report 'untested when 'runto_main' fails.  In non-stop mode
with 'target extended-remote', runto_main always fails with something like:

(gdb) run
Starting program: /home/me/gdb/testsuite/gdb.threads/non-ldr-exc-4
Unexpected vCont reply in non-stop mode: T0506:10e0ffffff7f0000;07:c8deffffff7f0000;10:c1a6abaaaa2a0000;thread:p5ee.5ee;core:0;

This happens in other tests as well (e.g. gdb.threads/thread_events.exp),
so I copied the error handling from that test so that the non-stop tests
report 'untested' for target extended-remote.  I couldn't find anything
related to this in the gdb bug database, but I assume it is a known problem
since the other tests handle it.

Thanks
--Don

gdb/testsuite/
2014-08-20  Don Breazeal  <donb@codesourcery.com>

	* gdb.base/foll-exec.exp (zap_session): Delete proc.
	(do_exec_tests): Replace zap_session with clean_restart.
	(main): Use clean_restart for initial GDB startup.
	* gdb.threads/non-ldr-exc-1.exp: Add non-stop cases.
	* gdb.threads/non-ldr-exc-2.exp: Ditto.
	* gdb.threads/non-ldr-exc-3.exp: Ditto.
	* gdb.threads/non-ldr-exc-4.exp: Ditto.

---
 gdb/testsuite/gdb.base/foll-exec.exp        |   44 ++++-----------------------
 gdb/testsuite/gdb.threads/non-ldr-exc-1.exp |   20 ++++++++++--
 gdb/testsuite/gdb.threads/non-ldr-exc-2.exp |   36 +++++++++++++++++++---
 gdb/testsuite/gdb.threads/non-ldr-exc-3.exp |   36 +++++++++++++++++++---
 gdb/testsuite/gdb.threads/non-ldr-exc-4.exp |   20 ++++++++++--
 5 files changed, 100 insertions(+), 56 deletions(-)
diff mbox

Patch

diff --git a/gdb/testsuite/gdb.base/foll-exec.exp b/gdb/testsuite/gdb.base/foll-exec.exp
index c1b1354..6051d29 100644
--- a/gdb/testsuite/gdb.base/foll-exec.exp
+++ b/gdb/testsuite/gdb.base/foll-exec.exp
@@ -44,32 +44,6 @@  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 gdb_prompt
    global binfile
@@ -103,7 +77,7 @@  proc do_exec_tests {} {
      return
    }
 
-   zap_session
+   clean_restart ${binfile}
 
    # Start the program running, and stop at main.
    #
@@ -191,7 +165,7 @@  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.
    #
@@ -264,7 +238,7 @@  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.
    #
@@ -324,7 +298,7 @@  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.
    #
@@ -376,9 +350,7 @@  proc do_exec_tests {} {
      timeout         {fail "(timeout) print execd-program/local_j (after execv)"}
    }
 
-   # 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.
    #
@@ -402,11 +374,7 @@  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.
diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp
index 8123a99..e35236a 100644
--- a/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp
+++ b/gdb/testsuite/gdb.threads/non-ldr-exc-1.exp
@@ -28,13 +28,19 @@  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 mode } {
+    with_test_prefix "lock-sched$lock_sched,$mode" {
 	global executable
 
 	clean_restart ${executable}
 
+	if { $mode == "non-stop" } {
+	    gdb_test_no_output "set target-async on" "set async mode"
+	    gdb_test_no_output "set non-stop on" "set non-stop mode"
+	}
+
 	if ![runto_main] {
+	    untested "could not run to main"
 	    return -1
 	}
 
@@ -48,11 +54,17 @@  proc do_test { lock_sched } {
 	    gdb_test_no_output "set scheduler-locking on"
 	}
 
+	if { $mode == "non-stop" } {
+	    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
+do_test 0 "all-stop"
+do_test 1 "all-stop"
+do_test 0 "non-stop"
+do_test 1 "non-stop"
diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp
index 857e7bc..a0281d6 100644
--- a/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp
+++ b/gdb/testsuite/gdb.threads/non-ldr-exc-2.exp
@@ -29,18 +29,42 @@  if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
     return -1
 }
 
-proc do_test { lock_sched } {
-    with_test_prefix "lock-sched$lock_sched" {
+# Test for breakpoint event among async thread events.
+# gdb_continue_to_breakpoint requires "$gdb_prompt $", but
+# here we may get a thread event message instead of EOL.
+proc gdb_continue_to_breakpoint_async { name pattern } {
+    global gdb_prompt
+
+    gdb_test_multiple "continue" $name {
+	-re ".*Breakpoint .* (at|in) ($pattern)$gdb_prompt " {
+	    pass $name
+	}
+    }
+}
+
+proc do_test { lock_sched mode } {
+    with_test_prefix "lock-sched$lock_sched,$mode" {
 	global executable
 
 	clean_restart ${executable}
 
+	if { $mode == "non-stop" } {
+	    gdb_test_no_output "set target-async on" "set async mode"
+	    gdb_test_no_output "set non-stop on" "set non-stop mode"
+	}
+
 	if ![runto_main] {
+	    untested "could not run to main"
 	    return -1
 	}
 
 	gdb_breakpoint [gdb_get_line_number "break-here"]
-	gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+	if { $mode == "non-stop" } {
+	    gdb_continue_to_breakpoint_async "break-here" ".* break-here .*"
+	    gdb_test "thread 2" "Switching.*"
+	} else {
+	    gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+	}
 
 	gdb_test "info threads" \
 	    "\r\n\[ \t\]*Id\[ \t\]+Target\[ \t\]+Id\[ \t\]+Frame\[ \t\]*\r\n\\* 2 *Thread \[^\r\n\]* at \[^\r\n\]*" \
@@ -59,5 +83,7 @@  proc do_test { lock_sched } {
     }
 }
 
-do_test 0
-do_test 1
+do_test 0 "all-stop"
+do_test 1 "all-stop"
+do_test 0 "non-stop"
+do_test 1 "non-stop"
diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp
index 7f33d39..69c27d8 100644
--- a/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp
+++ b/gdb/testsuite/gdb.threads/non-ldr-exc-3.exp
@@ -31,18 +31,42 @@  if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
     return -1
 }
 
-proc do_test { lock_sched } {
-    with_test_prefix "lock-sched$lock_sched" {
+# Test for breakpoint event among async thread events.
+# gdb_continue_to_breakpoint requires "$gdb_prompt $", but
+# here we may get a thread event message instead of EOL.
+proc gdb_continue_to_breakpoint_async { name pattern } {
+    global gdb_prompt
+
+    gdb_test_multiple "continue" $name {
+	-re ".*Breakpoint .* (at|in) ($pattern)$gdb_prompt " {
+	    pass $name
+	}
+    }
+}
+
+proc do_test { lock_sched mode } {
+    with_test_prefix "lock-sched$lock_sched,$mode" {
 	global executable
 
 	clean_restart ${executable}
 
+	if { $mode == "non-stop" } {
+	    gdb_test_no_output "set target-async on" "set async mode"
+	    gdb_test_no_output "set non-stop on" "set non-stop mode"
+	}
+
 	if ![runto_main] {
+	    untested "could not run to main"
 	    return -1
 	}
 
 	gdb_breakpoint [gdb_get_line_number "break-here"]
-	gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+	if { $mode == "non-stop" } {
+	    gdb_continue_to_breakpoint_async "break-here" ".* break-here .*"
+	    gdb_test "thread 2" "Switching.*"
+	} else {
+	    gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+	}
 
 	# Also test with sched-lock to make sure we can follow the
 	# non-leader thread execing even though the main thread wasn't
@@ -57,5 +81,7 @@  proc do_test { lock_sched } {
     }
 }
 
-do_test 0
-do_test 1
+do_test 0 "all-stop"
+do_test 1 "all-stop"
+do_test 0 "non-stop"
+do_test 1 "non-stop"
diff --git a/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp b/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp
index a5e88bb..f83577d 100644
--- a/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp
+++ b/gdb/testsuite/gdb.threads/non-ldr-exc-4.exp
@@ -30,13 +30,19 @@  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 mode } {
+    with_test_prefix "lock-sched$lock_sched,$mode" {
 	global executable
 
 	clean_restart ${executable}
 
+	if { $mode == "non-stop" } {
+	    gdb_test_no_output "set target-async on" "set async mode"
+	    gdb_test_no_output "set non-stop on" "set non-stop mode"
+	}
+
 	if ![runto_main] {
+	    untested "could not run to main"
 	    return -1
 	}
 
@@ -50,11 +56,17 @@  proc do_test { lock_sched } {
 	    gdb_test_no_output "set scheduler-locking on"
 	}
 
+	if { $mode == "non-stop" } {
+	    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
+do_test 0 "all-stop"
+do_test 1 "all-stop"
+do_test 0 "non-stop"
+do_test 1 "non-stop"