gdb/testsuite: Remove interactive prompt case from mi_gdb_test
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 3 Jan 2019 21:13:52 +0000 (21:13 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 9 Jan 2019 10:34:24 +0000 (10:34 +0000)
I noticed that when running this test:

  make check-gdb RUNTESTFLAGS="--target_board=native-gdbserver gdb.mi/mi-break.exp"

I would occasionally see some UNRESOLVED test results like this:

  (gdb)
  PASS: gdb.mi/mi-break.exp: mi-mode=separate: breakpoint at main
  Expecting: ^(kill[
  ]+)?(.*[
  ]+[(]gdb[)]
  [ ]*)
  kill
  &"kill\n"
  ~"Kill the program being debugged? (y or n) [answered Y; input not from terminal]\n"
  =thread-group-exited,id="i1"
  ERROR: Got interactive prompt.
  UNRESOLVED: gdb.mi/mi-break.exp: mi-mode=separate:

The problem appears to be that the expect buffer fills up to include
the '(y or n)' prompt without including the following lines.

The pattern supplied by the outer test script is looking for the
following lines.  As the following lines are not present then expect
matches on the interactive prompt case rather than the case for the
user supplied pattern.

The problem with this is that we are not really at an interactive
prompt, GDB is providing an answer for us and then moving on.  When I
examine a successful run of the test the output from GDB is identical,
the only difference is where expect happens to buffer the output from
GDB.

This patch remove all special handling of the interactive prompt
case.  This means that if we ever break GDB and start seeing an
unexpected interactive prompt then tests will rely on a timeout to
fail, instead of having dedicated interactive prompt detection, but
this solves the problem that an auto-answered prompt looks very
similar to an interactive prompt.

With this patch in place I can now leave the following loop running
indefinitely, where before it would fail usually after ~10
iterations.

  while make check-gdb RUNTESTFLAGS="--target_board=native-gdbserver gdb.mi/mi-break.exp"; \
  do /bin/true; \
  done

gdb/testsuite/ChangeLog:

* lib/mi-support.exp (mi_gdb_test): Remove interactive prompt
case.

gdb/testsuite/ChangeLog
gdb/testsuite/lib/mi-support.exp

index 3f7d72cd242120bb8def7587340cfd000cb1a77c..309cfb59040d9fbce2e2349b50ce5485b08c3c65 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-09  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * lib/mi-support.exp (mi_gdb_test): Remove interactive prompt
+       case.
+
 2019-01-06  Tom Tromey  <tom@tromey.com>
 
        PR gdb/28155:
index d193592a843b8d71ae32d04fcd470f0aef9cb16e..a58c4f6e1191d6b601b763f0595a0aeaf248c8f5 100644 (file)
@@ -832,11 +832,6 @@ proc mi_gdb_test { args } {
            send_gdb "\n"
            perror "Window too small."
             fail "$message"
-       }
-        -re "\\(y or n\\) " {
-           send_gdb "n\n"
-           perror "Got interactive prompt."
-            fail "$message"
        }
         eof {
             perror "Process no longer exists"