aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2015-10-09 12:56:26 +0100
committerPedro Alves <palves@redhat.com>2015-10-09 12:56:26 +0100
commit145e3ddb4b1657a1f29eb9f41f2d54d0bf26b6f0 (patch)
tree0177f1ee58a2b83d4a6714f39b1a6646578cda2d
parentbc04c45531c0a107c57afef239bdf66a21b3e958 (diff)
downloadgdb-145e3ddb4b1657a1f29eb9f41f2d54d0bf26b6f0.zip
gdb-145e3ddb4b1657a1f29eb9f41f2d54d0bf26b6f0.tar.gz
gdb-145e3ddb4b1657a1f29eb9f41f2d54d0bf26b6f0.tar.bz2
Fix gdb.base/a2-run.exp race
This patch fixes this racy failure, with the native-extended-gdbserver board: (gdb) run Starting program: build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run Remote debugging from host 127.0.0.1 Process build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run created; pid = 23832 Reading /lib64/ld-linux-x86-64.so.2 from remote target... warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /lib64/ld-linux-x86-64.so.2 from remote target... Reading /lib64/libm.so.6 from remote target... Reading /lib64/libc.so.6 from remote target... [Inferior 1 (process 23832) exited with code 01] (gdb) FAIL: gdb.base/a2-run.exp: run "a2-run" with no args PASS: gdb.base/a2-run.exp: no spurious messages at program exit run 5 Starting program: build/gdb/testsuite/outputs/gdb.base/a2-run/a2-run 5 Reading /lib64/ld-linux-x86-64.so.2 from remote target... usage: factorial <number> Child exited with status 1 Note that the output is correct; it's just that inferior output appeared after gdb's output, and the test doesn't handle that correctly. This comment isn't really correct, unfortunately: # waiting. If we had already seen the status wrapper exit, # gdb_test_multiple/expect has no spawn ids left, and thus # returns. That's true of expect in general, but I had missed / forgot that gdb_test_multiple internally has extra matches using "-i $gdb_spawn_id", so even if the caller clears all the indirect spawn id lists, gdb_test_multiple will continue waiting. So do a conditional exp_continue manually instead. gdb/testsuite/ChangeLog: 2015-10-09 Pedro Alves <palves@redhat.com> * gdb.base/a2-run.exp (maybe_exp_continue): New procedure. (top level): Use it in the run with no args test.
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/a2-run.exp54
2 files changed, 40 insertions, 19 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 3096936..a48bbee 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-09 Pedro Alves <palves@redhat.com>
+
+ * gdb.base/a2-run.exp (maybe_exp_continue): New procedure.
+ (top level): Use it in the run with no args test.
+
2015-10-08 Iain Buclaw <ibuclaw@gdcproject.org>
* gdb.dlang/properties.exp: New file.
diff --git a/gdb/testsuite/gdb.base/a2-run.exp b/gdb/testsuite/gdb.base/a2-run.exp
index dd6af25..8d2302b 100644
--- a/gdb/testsuite/gdb.base/a2-run.exp
+++ b/gdb/testsuite/gdb.base/a2-run.exp
@@ -39,57 +39,73 @@ set saw_spurious_output 0
set test "run \"$testfile\" with no args"
+# Indirect spawn id lists. Used to be able to disable the inferior
+# and gdb's spawn_ids and regexes as soon as we see the expected
+# output.
set inferior_spawn_list "$inferior_spawn_id"
set gdb_spawn_list "$gdb_spawn_id"
+# Clear either the gdb or the inferior spawn_id list and iff
+# afterwards we still have any spawn id in the indirect lists,
+# continue expecting.
+proc maybe_exp_continue {which} {
+ global inferior_spawn_list gdb_spawn_list
+
+ if {$which == "gdb"} {
+ set gdb_spawn_list ""
+ } elseif {$which == "inferior"} {
+ set inferior_spawn_list ""
+ } else {
+ error "invalid parameter"
+ }
+
+ if {$inferior_spawn_list != "" || $gdb_spawn_list != ""} {
+ exp_continue
+ }
+}
+
+# Note that if $inferior_spawn_id != $gdb_spawn_id the order we pick
+# output from each spawn id is undefined.
set res [gdb_test_multiple "" $test {
-i inferior_spawn_list
-re "usage: factorial <number>" {
set saw_usage 1
- exp_continue
+ maybe_exp_continue inferior
}
-re "EXIT code 1" {
set saw_exit_wrapper 1
- set inferior_spawn_list ""
- exp_continue
+ maybe_exp_continue inferior
}
eof {
if {$inferior_spawn_id != $gdb_spawn_id} {
# In this case we may see the server/inferior exit before
# GDB's program exit output. Remove from spawn list and
# continue waiting.
- set inferior_spawn_list ""
- exp_continue
+ maybe_exp_continue inferior
+ } else {
+ # GDB crash.
+ fail "$test (eof)"
}
- # GDB crash.
- fail "$test (eof)"
}
-i gdb_spawn_list
-re "$inferior_exited_re with code 01.\r\n$gdb_prompt $" {
+ maybe_exp_continue gdb
}
-re "$inferior_exited_re with code 01.*$gdb_prompt $" {
set saw_spurious_output 1
+ maybe_exp_continue gdb
}
-re "$inferior_exited_re normally.\r\n$gdb_prompt $" {
# This is only considered a pass if we see the exit wrapper
- # status. Since if $inferior_spawn_id != $gdb_spawn_id the
- # order we pick output from each spawn id isn't defined,
- # remove gdb_spawn_id from the match lists and go back to
- # waiting. If we had already seen the status wrapper exit,
- # gdb_test_multiple/expect has no spawn ids left, and thus
- # returns.
- set gdb_spawn_list ""
- exp_continue
+ # status.
+ maybe_exp_continue gdb
}
-re "$inferior_exited_re normally.*$gdb_prompt $" {
set saw_spurious_output 1
-
- # See above.
- set gdb_spawn_list ""
- exp_continue
+ maybe_exp_continue gdb
}
}]