Increase timeout in watch-bitfields.exp for software watchpoint
authorYao Qi <yao.qi@linaro.org>
Wed, 15 Apr 2015 11:46:58 +0000 (12:46 +0100)
committerYao Qi <yao.qi@linaro.org>
Wed, 15 Apr 2015 11:46:58 +0000 (12:46 +0100)
I see the following two timeout fails on pandaboard (arm-linux target),

 FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: continue until exit (timeout)
 FAIL: gdb.base/watch-bitfields.exp: regular watch against bitfields: continue until exit (timeout)

In this test, more than one watchpoint is used, so the following
watchpoint requests fall back to software watchpoint, so that GDB
will single step all the way and it is very slow.

This patch is to copy the fix from

  [PATCH] GDB/testsuite: Correct gdb.base/watchpoint-solib.exp timeout tweak
  https://sourceware.org/ml/gdb-patches/2014-07/msg00716.html

I find the left-over of this patch review is to factor out code into
a procedure, so I do that in this patch.

Re-run tests watch-bitfields.exp, watchpoint-solib.exp, sigall-reverse.exp,
and until-precsave.exp on pandaboard, no regression.

gdb/testsuite:

2015-04-15  Pedro Alves  <palves@redhat.com>
    Yao Qi  <yao.qi@linaro.org>

* gdb.base/watch-bitfields.exp (test_watch_location): Increase
timeout by factor of 4.
(test_regular_watch): Likewise.
* gdb.base/watchpoint-solib.exp: Use with_timeout_factor.
* gdb.reverse/sigall-reverse.exp: Likewise.
* gdb.reverse/until-precsave.exp: Likewise.
* lib/gdb.exp (with_timeout_factor): New proc.
(gdb_expect): Move some code to ...
(get_largest_timeout): ... here.  New procedure.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/watch-bitfields.exp
gdb/testsuite/gdb.base/watchpoint-solib.exp
gdb/testsuite/gdb.reverse/sigall-reverse.exp
gdb/testsuite/gdb.reverse/until-precsave.exp
gdb/testsuite/lib/gdb.exp

index c49519f319b0aef81cc163e61a51d4661a513e13..6098a620eb48c192709c0275a4c77620041cfaa4 100644 (file)
@@ -1,3 +1,16 @@
+2015-04-15  Pedro Alves  <palves@redhat.com>
+           Yao Qi  <yao.qi@linaro.org>
+
+       * gdb.base/watch-bitfields.exp (test_watch_location): Increase
+       timeout by factor of 4.
+       (test_regular_watch): Likewise.
+       * gdb.base/watchpoint-solib.exp: Use with_timeout_factor.
+       * gdb.reverse/sigall-reverse.exp: Likewise.
+       * gdb.reverse/until-precsave.exp: Likewise.
+       * lib/gdb.exp (with_timeout_factor): New proc.
+       (gdb_expect): Move some code to ...
+       (get_largest_timeout): ... here.  New procedure.
+
 2015-04-14  Luis Machado  <lgustavo@codesourcery.com>
 
        * gdb.base/bp-permanent.exp (test): Reinstate correct test message.
index 9d5293b7eac7f7f61ce3b6d22b9796a90d37978a..4f97043214b3d3a1e822dbd0dfd3ec8b5d820a96 100644 (file)
@@ -54,7 +54,14 @@ proc test_watch_location {} {
        expect_watchpoint "q.e" 0 5
        expect_watchpoint "q.a" 1 0
        expect_watchpoint "q.e" 5 4
-       gdb_continue_to_end
+
+       # It'll execute a large amount of code with software watchpoint
+       # enabled, which means GDB will single stepping all the way
+       # through til the inferior exits.  Increase the timeout by a
+       # factor of 4.
+       with_timeout_factor 4 {
+           gdb_continue_to_end
+       }
     }
 }
 
@@ -73,7 +80,14 @@ proc test_regular_watch {} {
        expect_watchpoint "q.d + q.f + q.g" 3 2
        expect_watchpoint "q.d + q.f + q.g" 2 1
        expect_watchpoint "q.d + q.f + q.g" 1 0
-       gdb_continue_to_end
+
+       # It'll execute a large amount of code with software watchpoint
+       # enabled, which means GDB will single stepping all the way
+       # through til the inferior exits.  Increase the timeout by a
+       # factor of 4.
+       with_timeout_factor 4 {
+           gdb_continue_to_end
+       }
     }
 }
 
index 85e83f7515bca451b4bc58d38b92466b458abf08..9475b370965ce11b91ad9daebf5d90702109f54c 100644 (file)
@@ -75,17 +75,8 @@ gdb_test "watch g" "atchpoint 3: g" "set watchpoint on g"
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit"
 rerun_to_main
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 30 {
+    gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
 }
-set timeout [expr $oldtimeout * 30]
-
-gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
-
-set timeout $savedtimeout
 
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit again"
index 69152d4c128a898318fdf0508d985b333b50ba49..065eea7190d47b11a2dbf70d97c981138eee7f7e 100644 (file)
@@ -251,18 +251,11 @@ gdb_test "continue" \
     "get signal TERM"
 gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM"
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 2 {
+    gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
+       "The next instruction is syscall exit_group.* program...y. or n. " \
+       "yes"
 }
-set timeout [expr $oldtimeout * 2]
-gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
-    "The next instruction is syscall exit_group.* program...y. or n. " \
-    "yes"
-set timeout $savedtimeout
 
 foreach sig [lreverse $signals] {
     test_one_sig_reverse $sig
index 1684645fbff113902c460e168f66f3df439e0685..640839fea5737839deacb9a842c404b490a8c52e 100644 (file)
@@ -49,22 +49,17 @@ gdb_test "break $end_of_main" \
     "BP at end of main"
 
 # This can take awhile.
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 15 {
+    gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 }
-set timeout [expr $oldtimeout * 15]
-gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 
 # So can this, against gdbserver, for example.
-set timeout [expr $oldtimeout * 3]
-gdb_test "record save $precsave" \
-    "Saved core file $precsave with execution log\."  \
-    "save process recfile"
-set timeout $savedtimeout
+
+with_timeout_factor 3 {
+    gdb_test "record save $precsave" \
+       "Saved core file $precsave with execution log\."  \
+       "save process recfile"
+}
 
 gdb_test "kill" "" "Kill process, prepare to debug log file" \
     "Kill the program being debugged\\? \\(y or n\\) " "y"
index f1616e3fe35660cc8e331a17ec3efce25d47afca..7d8720b194e121187c5867f9fd7b194dd8d4c875 100644 (file)
@@ -1894,6 +1894,54 @@ proc with_target_charset { target_charset body } {
     }
 }
 
+# Select the largest timeout from all the timeouts:
+# - the local "timeout" variable of the scope two levels above,
+# - the global "timeout" variable,
+# - the board variable "gdb,timeout".
+
+proc get_largest_timeout {} {
+    upvar #0 timeout gtimeout
+    upvar 2 timeout timeout
+
+    set tmt 0
+    if [info exists timeout] {
+      set tmt $timeout
+    }
+    if { [info exists gtimeout] && $gtimeout > $tmt } {
+       set tmt $gtimeout
+    }
+    if { [target_info exists gdb,timeout]
+        && [target_info gdb,timeout] > $tmt } {
+       set tmt [target_info gdb,timeout]
+    }
+    if { $tmt == 0 } {
+       # Eeeeew.
+       set tmt 60
+    }
+
+    return $tmt
+}
+
+# Run tests in BODY with timeout increased by factor of FACTOR.  When
+# BODY is finished, restore timeout.
+
+proc with_timeout_factor { factor body } {
+    global timeout
+
+    set savedtimeout $timeout
+
+    set timeout [expr [get_largest_timeout] * $factor]
+    set code [catch {uplevel 1 $body} result]
+
+    set timeout $savedtimeout
+    if {$code == 1} {
+       global errorInfo errorCode
+       return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
+    } else {
+       return -code $code $result
+    }
+}
+
 # Return 1 if _Complex types are supported, otherwise, return 0.
 
 gdb_caching_proc support_complex_tests {
@@ -3266,26 +3314,10 @@ proc gdb_expect { args } {
 
     # A timeout argument takes precedence, otherwise of all the timeouts
     # select the largest.
-    upvar #0 timeout gtimeout
-    upvar timeout timeout
     if [info exists atimeout] {
        set tmt $atimeout
     } else {
-       set tmt 0
-       if [info exists timeout] {
-           set tmt $timeout
-       }
-       if { [info exists gtimeout] && $gtimeout > $tmt } {
-           set tmt $gtimeout
-       }
-       if { [target_info exists gdb,timeout]
-            && [target_info gdb,timeout] > $tmt } {
-           set tmt [target_info gdb,timeout]
-       }
-       if { $tmt == 0 } {
-           # Eeeeew.
-           set tmt 60
-       }
+       set tmt [get_largest_timeout]
     }
 
     global suppress_flag