[4/4] Non-stop exec tests

Message ID 1400885374-18915-5-git-send-email-donb@codesourcery.com
State New, archived
Headers

Commit Message

Don Breazeal May 23, 2014, 10:49 p.m. UTC
  This patch 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.

Regards,
--Don

testsuite/
2014-05-22  Don Breazeal  <donb@codesourcery.com>

	* 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.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 ++++++++++++---
 4 files changed, 94 insertions(+), 18 deletions(-)
  

Comments

Doug Evans May 26, 2014, 3:29 a.m. UTC | #1
On Fri, May 23, 2014 at 3:49 PM, Don Breazeal <donb@codesourcery.com> wrote:
> This patch 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;

Did you try --target_board=native-extended-gdbserver ?

> 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.
>
> Regards,
> --Don
>
> testsuite/
> 2014-05-22  Don Breazeal  <donb@codesourcery.com>
>
>         * 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.

Hi.
Still going through the patch series, but have an initial comment.

The following test at the top of each .exp file could be changed to
something like !linux && is_remote, right?

# No exec event support in the remote protocol.
if { [is_remote target] } then {
    continue
}

These tests now pass with native-gdbserver (and
native-extended-gdbserver) so we'll want to at least run these tests
with those, I presume.
  
Don Breazeal May 27, 2014, 6:31 p.m. UTC | #2
Thank you for looking at this.

On 5/25/2014 8:29 PM, Doug Evans wrote:
> On Fri, May 23, 2014 at 3:49 PM, Don Breazeal <donb@codesourcery.com> wrote:
>> This patch 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;
> 
> Did you try --target_board=native-extended-gdbserver ?

Yes.  To be clear, the exec events are only implemented for multiprocess
/ extended-remote.  Before posting the initial patch I tested native
GDB, --target_board=native-gdbserver, and
--target_board=native-extended-gdbserver.

> 
>> 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.
>>
>> Regards,
>> --Don
>>
>> testsuite/
>> 2014-05-22  Don Breazeal  <donb@codesourcery.com>
>>
>>         * 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.
> 
> Hi.
> Still going through the patch series, but have an initial comment.
> 
> The following test at the top of each .exp file could be changed to
> something like !linux && is_remote, right?
> 
> # No exec event support in the remote protocol.
> if { [is_remote target] } then {
>     continue
> }
> 
> These tests now pass with native-gdbserver (and
> native-extended-gdbserver) so we'll want to at least run these tests
> with those, I presume.
> 
I don't expect the tests to pass with native-gdbserver, since the
implementation is only for multiprocess/extended-remote.  I should have
made that more apparent.

[Note: the rationale for restricting exec events to multiprocess was
that follow-exec-mode can allow multiple inferiors to exist, even if
they aren't running simultaneously.  Also, follow-exec-mode and
follow-fork-mode are closely related, and follow-fork-mode definitely
requires multiprocess.]

The native-extended-gdbserver tests aren't affected by the test for
remote at the top of each .exp file.  The GDB manual says that these
events (or at least fork events) are supported for native GDB on newer
versions of Linux and HP-UX, and any change I make for
native-extended-gdbserver will affect the native tests.

Given that the feature is only available with extended-remote, do you
still feel I need to change something?  I'm not sure how to restrict a
test to "Linux or HP-UX", or to newer versions of them.

Thanks
--Don
  

Patch

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"