Re: [PATCH v2 3/3] gdb: introduce scoped debug prints

tdevries
2021-01-05T21:27:04Z

On 2021-01-05 18:02, Simon Marchi wrote:
> On 2021-01-05 10:33 a.m., Simon Marchi via Gdb-patches wrote:
>> Thanks for reporting. The test passes here 90% of the time, but when
>> I
>> run it in a loop it eventually fails like the others I fixed.
>>
>> I'd rather add a -prompt flag to gdb_test_sequence, what do you think?

Yeah, that's not a bad idea.

The only bit that concerns me is that there's already a -prompt switch
for gdb_test_multiple, which does not add on the terminating '$', while
this version does.

It's probably a good idea to have the -prompt switch to behave the same
in both cases.

Thanks,
- Tom

>> I'll start working on that and give it a try.
>
> Here's what I propose:
>
> From fac85012df91bc9b70e2d1d8df12de1dab2ab44c Mon Sep 17 00:00:00 2001
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Date: Tue, 5 Jan 2021 11:02:07 -0500
> Subject: [PATCH] gdb/testsuite: fix race in
> gdb.threads/signal-while-stepping-over-bp-other-thread.exp
>
> Commit 3ec3145c5dd6 ("gdb: introduce scoped debug prints") updated some
> tests using "set debug infrun" to handle the fact that a debug print is
> now shown after the prompt, after an inferior stop. The same issue
> happens in gdb.threads/signal-while-stepping-over-bp-other-thread.exp.
> If I run it in a loop, it eventually fails like these other tests.
>
> The problem is that the testsuite expects to see $gdb_prompt followed
> by
> the end of the buffer. It happens that expect reads $gdb_prompt and
> the
> debug print at the same time, in which case the regexp never matches
> and
> we get a timeout.
>
> The fix is the same as was done in 3ec3145c5dd6, make the testsuite
> believe that the prompt is the standard GDB prompt followed by that
> debug print.
>
> Since that test uses gdb_test_sequence, and the expected prompt is in
> gdb_test_sequence, add a -prompt switch to gdb_test_sequence to
> override
> the prompt used for that call.
>
> gdb/testsuite/ChangeLog:
>
> * lib/gdb.exp (gdb_test_sequence): Accept -prompt switch.
> * gdb.threads/signal-while-stepping-over-bp-other-thread.exp:
> Pass prompt containing debug print to gdb_test_sequence.
>
> Change-Id: I33161c53ddab45cdfeadfd50b964f8dc3caa9729
> ---
> ...al-while-stepping-over-bp-other-thread.exp | 2 +-
> gdb/testsuite/lib/gdb.exp | 23 +++++++++++++++++--
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git
> a/gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.exp
> b/gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.exp
> index fe8425319779..cc8b3200fbc2 100644
> ---
> a/gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.exp
> +++
> b/gdb/testsuite/gdb.threads/signal-while-stepping-over-bp-other-thread.exp
> @@ -102,7 +102,7 @@ gdb_test "set scheduler-locking off"
> gdb_test "set debug infrun 1"
>
> set test "step"
> -gdb_test_sequence $test $test {
> +gdb_test_sequence $test $test -prompt "$gdb_prompt \\\[infrun\\\]
> fetch_inferior_event: exit\r\n" {
> "need to step-over"
> "resume_1: step=1,"
> "signal arrived while stepping over breakpoint"
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 3f61da8adf12..f3880ecf56bb 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -1401,6 +1401,9 @@ proc gdb_test_no_output { args } {
> # EXPECTED_OUTPUT_LIST is a list of regexps of expected output, which
> are
> # processed in order, and all must be present in the output.
> #
> +# The -prompt switch can be used to override the prompt expected at
> the end of
> +# the output sequence.
> +#
> # It is unnecessary to specify ".*" at the beginning or end of any
> regexp,
> # there is an implicit ".*" between each element of
> EXPECTED_OUTPUT_LIST.
> # There is also an implicit ".*" between the last regexp and the gdb
> prompt.
> @@ -1413,16 +1416,32 @@ proc gdb_test_no_output { args } {
> # 0 if the test passes,
> # -1 if there was an internal error.
>
> -proc gdb_test_sequence { command test_name expected_output_list } {
> +proc gdb_test_sequence { args } {
> global gdb_prompt
> +
> + parse_args {{prompt ""}}
> +
> + if { $prompt == "" } {
> + set prompt "$gdb_prompt "
> + }
> +
> + if { [llength $args] != 3 } {
> + error "Unexpected # of arguments, expecting: COMMAND TEST_NAME
> EXPECTED_OUTPUT_LIST"
> + }
> +
> + lassign $args command test_name expected_output_list
> +
> if { $test_name == "" } {
> set test_name $command
> }
> +
> lappend expected_output_list ""; # implicit ".*" before gdb prompt
> +
> if { $command != "" } {
> send_gdb "$command\n"
> }
> - return [gdb_expect_list $test_name "$gdb_prompt $"
> $expected_output_list]
> +
> + return [gdb_expect_list $test_name "${prompt}$"
> $expected_output_list]
> }
>
> \f