gdb/testsuite: fix race in gdb.threads/signal-while-stepping-over-bp-other-thread.exp
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 6 Jan 2021 15:53:22 +0000 (10:53 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Wed, 6 Jan 2021 15:53:22 +0000 (10:53 -0500)
Commit 3ec3145c5dd6 ("gdb: introduce scoped debug prints") updated some
tests using "set debug infrun" to handle the fact that a debug print is
now shown after the prompt, after an inferior stop.  The same issue
happens in gdb.threads/signal-while-stepping-over-bp-other-thread.exp.
If I run it in a loop, it eventually fails like these other tests.

The problem is that the testsuite expects to see $gdb_prompt followed by
the end of the buffer.  It happens that expect reads $gdb_prompt and the
debug print at the same time, in which case the regexp never matches and
we get a timeout.

The fix is the same as was done in 3ec3145c5dd6, make the testsuite
believe that the prompt is the standard GDB prompt followed by that
debug print.

Since that test uses gdb_test_sequence, and the expected prompt is in
gdb_test_sequence, add a -prompt switch to gdb_test_sequence to override
the prompt used for that call.

gdb/testsuite/ChangeLog:

* lib/gdb.exp (gdb_test_sequence): Accept -prompt switch.
* gdb.threads/signal-while-stepping-over-bp-other-thread.exp:
Pass prompt containing debug print to gdb_test_sequence.

Change-Id: I33161c53ddab45cdfeadfd50b964f8dc3caa9729

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.exp
gdb/testsuite/lib/gdb.exp

index 2e475184868ce133e6c317e4065604efedb384f0..d3c6e952132a036f00ec48f25240dd2a1d2adc68 100644 (file)
@@ -1,3 +1,9 @@
+2021-01-06  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * lib/gdb.exp (gdb_test_sequence): Accept -prompt switch.
+       * gdb.threads/signal-while-stepping-over-bp-other-thread.exp:
+       Pass prompt containing debug print to gdb_test_sequence.
+
 2021-01-04  Tom de Vries  <tdevries@suse.de>
 
        * gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: New file.
index fe84253197790c998d3840951ec0d5970b40c9af..28074854479a962c166220e7a9aa1af47dc22ae6 100644 (file)
@@ -102,7 +102,7 @@ gdb_test "set scheduler-locking off"
 gdb_test "set debug infrun 1"
 
 set test "step"
-gdb_test_sequence $test $test {
+gdb_test_sequence $test $test -prompt "$gdb_prompt \\\[infrun\\\] fetch_inferior_event: exit\r\n$"  {
     "need to step-over"
     "resume_1: step=1,"
     "signal arrived while stepping over breakpoint"
index 3f61da8adf128fd3092c9089b53a5d2dfa8086b7..140e3960a32d9db3cec8d05f8994a141b72853a4 100644 (file)
@@ -1401,6 +1401,9 @@ proc gdb_test_no_output { args } {
 # EXPECTED_OUTPUT_LIST is a list of regexps of expected output, which are
 # processed in order, and all must be present in the output.
 #
+# The -prompt switch can be used to override the prompt expected at the end of
+# the output sequence.
+#
 # It is unnecessary to specify ".*" at the beginning or end of any regexp,
 # there is an implicit ".*" between each element of EXPECTED_OUTPUT_LIST.
 # There is also an implicit ".*" between the last regexp and the gdb prompt.
@@ -1413,16 +1416,32 @@ proc gdb_test_no_output { args } {
 #    0 if the test passes,
 #   -1 if there was an internal error.
 
-proc gdb_test_sequence { command test_name expected_output_list } {
+proc gdb_test_sequence { args } {
     global gdb_prompt
+
+    parse_args {{prompt ""}}
+
+    if { $prompt == "" } {
+       set prompt "$gdb_prompt $"
+    }
+
+    if { [llength $args] != 3 } {
+       error "Unexpected # of arguments, expecting: COMMAND TEST_NAME EXPECTED_OUTPUT_LIST"
+    }
+
+    lassign $args command test_name expected_output_list
+
     if { $test_name == "" } {
        set test_name $command
     }
+
     lappend expected_output_list ""; # implicit ".*" before gdb prompt
+
     if { $command != "" } {
        send_gdb "$command\n"
     }
-    return [gdb_expect_list $test_name "$gdb_prompt $" $expected_output_list]
+
+    return [gdb_expect_list $test_name $prompt $expected_output_list]
 }
 
 \f