aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.reverse
diff options
context:
space:
mode:
authorThiago Jung Bauermann <thiago.bauermann@linaro.org>2023-05-31 21:46:29 +0200
committerThiago Jung Bauermann <thiago.bauermann@linaro.org>2023-06-23 23:05:02 +0200
commit7b81dececfe5dd6e2891eda90c6daa02dced6c0e (patch)
tree481c7322c3076a4b057c3b5ab2b50036adaf82a5 /gdb/testsuite/gdb.reverse
parent5a97377e55134b585a4f92569e9b6bf958af8daf (diff)
downloadgdb-7b81dececfe5dd6e2891eda90c6daa02dced6c0e.zip
gdb-7b81dececfe5dd6e2891eda90c6daa02dced6c0e.tar.gz
gdb-7b81dececfe5dd6e2891eda90c6daa02dced6c0e.tar.bz2
gdb/testsuite: Avoid infinite loop in gdb.reverse/step-reverse.exp
This testcase sometimes gets stuck in a loop for hours when running in our CI. The problem is that due to an issue unrelated to reverse debugging the inferior exits early, and because of the overly generic ".*" pattern the testcase keeps sending the "next" command without noticing that the inferior is gone. gdb_test_multiple has a pattern to detect that "The program is not being run.", but since it is placed after the patterns from the caller it won't be triggered. It also has a timeout pattern but because it is triggered between successful matches, each time the test matches the '-re -wrap ".*"' this counts as a successful match and the timeout is reset. Since the test binary is compiled with debug information, fix by changing one of the generic patterns to match entering the main function and the other one to match the source code line number that is shown by GDB right after the "step" command. Also, as a precaution add a maximum number of times the "next" command will be sent. Co-Authored-By: Tom de Vries <tdevries@suse.de> Reviewed-By: Bruno Larsen <blarsen@redhat.com> Approved-By: Tom de Vries <tdevries@suse.de>
Diffstat (limited to 'gdb/testsuite/gdb.reverse')
-rw-r--r--gdb/testsuite/gdb.reverse/step-reverse.exp28
1 files changed, 25 insertions, 3 deletions
diff --git a/gdb/testsuite/gdb.reverse/step-reverse.exp b/gdb/testsuite/gdb.reverse/step-reverse.exp
index 729218d..4b78a8f 100644
--- a/gdb/testsuite/gdb.reverse/step-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/step-reverse.exp
@@ -247,6 +247,7 @@ gdb_test_multiple "step" "$test_message" {
gdb_test "next" ".*NEXT OVER THIS CALL.*" "reverse next over call"
set step_out 0
+set max_iterations 1000
gdb_test_multiple "next" "reverse next over recursion" {
-re -wrap ".*NEXT OVER THIS RECURSION.*" {
pass "$gdb_test_name"
@@ -257,11 +258,19 @@ gdb_test_multiple "next" "reverse next over recursion" {
}
}
if { "$step_out" == 1 } {
+ set iterations 0
gdb_test_multiple "next" "stepping out of recursion" {
- -re -wrap "NEXT OVER THIS RECURSION.*" {
+ -re -wrap "^main.*NEXT OVER THIS RECURSION.*" {
set step_out 0
+ pass "$gdb_test_name"
}
- -re -wrap ".*" {
+ -re -wrap "^\[0-9\].*" {
+ incr iterations
+ if { $iterations == $max_iterations } {
+ fail "$gdb_test_name (reached $max_iterations iterations)"
+ return
+ }
+
send_gdb "next\n"
exp_continue
}
@@ -276,9 +285,16 @@ gdb_test_no_output "set exec-dir reverse" "reverse again to test recursion"
gdb_test "step" ".*EXIT RECURSIVE FUNCTION.*" "enter recursive function"
set seen_recursive_call 0
+set iterations 0
gdb_test_multiple "next" "step over recursion inside the recursion" {
-re -wrap ".*RECURSIVE CALL.*" {
incr seen_recursive_call
+ incr iterations
+ if { $iterations == $max_iterations } {
+ fail "$gdb_test_name (reached $max_iterations iterations)"
+ return
+ }
+
send_gdb "next\n"
exp_continue
}
@@ -286,7 +302,13 @@ gdb_test_multiple "next" "step over recursion inside the recursion" {
gdb_assert {"$seen_recursive_call" == 1} \
"step over recursion inside the recursion"
}
- -re -wrap ".*" {
+ -re -wrap "^\[0-9\].*" {
+ incr iterations
+ if { $iterations == $max_iterations } {
+ fail "$gdb_test_name (reached $max_iterations iterations)"
+ return
+ }
+
send_gdb "next\n"
exp_continue
}