[gdb/testsuite] Make gdb.threads/inf-thr-count.exp more readable

While investigating a timeout in gdb.threads/inf-thr-count.exp I noticed that
it uses quite some escaping, resulting in hard-to-parse regexps like
"\\\$$::decimal".

Fix this by reducing the escaping using:
- quoting strings using {} instead of "", and
- string_to_regexp.

Also use multi_line to split up long multi-line regexps.

Tested on x86_64-linux.
This commit is contained in:
Tom de Vries
2025-05-02 10:28:13 +02:00
parent 3cecedf089
commit 0de07b9863

View File

@@ -43,7 +43,7 @@ if {[build_executable "failed to prepare" $testfile $srcfile \
# Start GDB. Ensure we are in non-stop mode as we need to read from
# the inferior while it is running.
save_vars {GDBFLAGS} {
append GDBFLAGS " -ex \"set non-stop on\""
append GDBFLAGS { -ex "set non-stop on"}
clean_restart $binfile
}
@@ -54,22 +54,20 @@ if ![runto_main] {
gdb_breakpoint breakpt
gdb_continue_to_breakpoint "first breakpt call"
set re_var [string_to_regexp "$"]$decimal
# Check we can see a single thread to begin with.
gdb_test "p \$_inferior_thread_count" \
"^\\\$$::decimal = 1" \
"only one thread in \$_inferior_thread_count"
gdb_test {p $_inferior_thread_count} \
"^$re_var = 1" \
{only one thread in $_inferior_thread_count}
# We don't want thread events, it makes it harder to match GDB's
# output.
gdb_test_no_output "set print thread-events off"
# Continue the program in the background.
set test "continue&"
gdb_test_multiple "continue&" $test {
-re "Continuing\\.\r\n$gdb_prompt " {
pass $test
}
}
gdb_test -no-prompt-anchor "continue&" \
[string_to_regexp "Continuing."]
# Read the 'stage' flag from the inferior. This is initially 0, but
# will be set to 1 once the extra thread has been created, and then 2
@@ -88,8 +86,17 @@ proc wait_for_stage { num } {
set failure_count 0
set cmd "print /d stage"
set stage_flag 0
set re_int -?$::decimal
set re_msg \
[multi_line \
"Cannot execute this command while the target is running" \
{Use the "interrupt" command to stop the target} \
[string_to_regexp "and then try again."]]
gdb_test_multiple "$cmd" "wait for 'stage' flag to be $num" {
-re -wrap "^Cannot execute this command while the target is running\\.\r\nUse the \"interrupt\" command to stop the target\r\nand then try again\\." {
-re -wrap ^$re_msg {
fail "$gdb_test_name (can't read asynchronously)"
gdb_test_no_output "interrupt"
@@ -101,7 +108,7 @@ proc wait_for_stage { num } {
}
}
-re -wrap "^\\$\[0-9\]* = (\[-\]*\[0-9\]*).*" {
-re -wrap "^$::re_var = ($re_int).*" {
set stage_flag $expect_out(1,string)
if {$stage_flag != $num} {
set stage_flag 0
@@ -131,8 +138,8 @@ if {![wait_for_stage 1]} {
if {[target_info exists gdb_protocol]
&& ([target_info gdb_protocol] == "remote"
|| [target_info gdb_protocol] == "extended-remote")} {
set new_thread_re "\\\[New Thread \[^\r\n\]+\\\]\r\n"
set exit_thread_re "\\\[Thread \[^\r\n\]+ exited\\\]\r\n"
set new_thread_re {\[New Thread [^\r\n]+\]\r\n}
set exit_thread_re {\[Thread [^\r\n]+ exited\]\r\n}
} else {
set new_thread_re ""
set exit_thread_re ""
@@ -141,9 +148,9 @@ if {[target_info exists gdb_protocol]
# This is the test we actually care about. Check that the
# $_inferior_thread_count convenience variable shows the correct
# thread count; the new thread should be visible.
gdb_test "with print thread-events on -- p \$_inferior_thread_count" \
"^${new_thread_re}\\\$$::decimal = 2" \
"second thread visible in \$_inferior_thread_count"
gdb_test {with print thread-events on -- p $_inferior_thread_count} \
"^${new_thread_re}$re_var = 2" \
{second thread visible in $_inferior_thread_count}
# Set a variable in the inferior, this will cause the second thread to
# exit.
@@ -157,9 +164,9 @@ if {![wait_for_stage 2]} {
}
# Check that the second thread has gone away.
gdb_test "with print thread-events on -- p \$_inferior_thread_count" \
"^${exit_thread_re}\\\$$::decimal = 1" \
"back to one thread visible in \$_inferior_thread_count"
gdb_test {with print thread-events on -- p $_inferior_thread_count} \
"^${exit_thread_re}$re_var = 1" \
{back to one thread visible in $_inferior_thread_count}
# Set a variable in the inferior, this will cause the second thread to
# exit.
@@ -168,8 +175,14 @@ gdb_test_no_output -no-prompt-anchor "set variable spin = 0" \
# When the second thread exits, the main thread joins with it, and
# then proceeds to hit the breakpt function again.
set re_breakpt [string_to_regexp "breakpt ()"]
set re \
[multi_line \
"Thread 1 \[^\r\n\]+ hit Breakpoint $decimal, $re_breakpt\[^\r\n\]+" \
"\[^\r\n\]+" \
""]
gdb_test_multiple "" "wait for main thread to stop" {
-re "Thread 1 \[^\r\n\]+ hit Breakpoint $decimal, breakpt \\(\\)\[^\r\n\]+\r\n\[^\r\n\]+\r\n" {
-re $re {
pass $gdb_test_name
}
}