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

Tom de Vries
2021-01-06T07:15:40Z

On 1/6/21 2:00 AM, Simon Marchi wrote:
> On 2021-01-05 4:54 p.m., Simon Marchi wrote:
>> On 2021-01-05 4:26 p.m., tdevries wrote:
>>> 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.
>>
>> Hmm I see. Intuitively, I'd try to make gdb_test_multiple add
>> the terminating $. Do you foresee some problems with that?
>>
>> The prompt passed to gdb_test_multiple only appears to be used
>> for the various failing cases, so I don't expect that to change
>> any passing test (I'll give it a try).
>
> Well, now that I think of it a bit more, it would be much easier and safer
> to just make my gdb_test_sequence's -prompt work like gdb_test_multiple's -prompt,
> and have the caller add the $ itself.
>
> Updated patch below.

Thanks, LGTM.

- Tom

>
> From 23d207b6f391312f82fcaeae9936c97470461415 Mon Sep 17 00:00:00 2001
> From: Simon Marchi <simon.marchi@polymtl.ca>
> Date: Tue, 05 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
> ---
>
> 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 fe84253..2807485 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 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 3f61da8..140e396 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -1401,6 +1401,9 @@
> # 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 @@
> # 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
>
>