[PATCH][gdb/testsuite] Detect gdb prompt after monitor exit

Pedro Alves pedro@palves.net
Wed Sep 16 10:59:34 GMT 2020


On 9/15/20 3:17 PM, Tom de Vries wrote:

> Anyway, this seems to work:
> ...
> index a2cc80f28d..24733275ae 100644
> --- a/gdb/testsuite/lib/gdbserver-support.exp
> +++ b/gdb/testsuite/lib/gdbserver-support.exp
> @@ -451,13 +451,20 @@ proc gdbserver_exit { is_mi } {
>             # We use expect rather than gdb_expect because
>             # we want to suppress printing exception messages, otherwise,
>             # remote_expect, invoked by gdb_expect, prints the exceptions.
> +           set have_prompt 0
>             expect {
>                 -i "$gdb_spawn_id" -re "$gdb_prompt $" {
> -                   exp_continue
> +                   if { [info exists server_spawn_id] } {
> +                       set have_prompt 1

I'd put this "set have_prompt 1" outside of the if, seems would read
clearer to me.

Otherwise LGTM.

> +                       exp_continue
> +                   }
>                 }
>                 -i "$server_spawn_id" eof {
>                     wait -i $expect_out(spawn_id)
>                     unset server_spawn_id
> +                   if { ! $have_prompt } {
> +                       exp_continue
> +                   }
>                 }
>                 timeout {
>                     warning "Timed out waiting for EOF in server after
> $monitor_exit"
> ...
> 
> I do wonder though about unsetting server_spawn_id and doing
> exp_continue while we still have the clause -i $server_spawn_id eof.  I
> wonder this is supported behaviour.

I'm not super sure, but I think it is, in that I don't think
the -i expression is reevaluated after exp_continue.

For example, this works:

$ cat exp.exp 
set fake_spawn_id foo

expect {
    -re "foo" {
        puts " got foo"
        if [info exists fake_spawn_id] {
            puts " unset"
            unset fake_spawn_id
        }
        exp_continue
    }
    -i "$fake_spawn_id" -re "bar" {
            puts " got bar?"
    }
}

$ expect exp.exp 
foo
 got foo
 unset
foo
 got foo
foo
 got foo
bar
foo
 got foo

If it turns out to be an issue, we can always use an indirect
spawn id instead:

  "The -i flag may also name a global variable in which case the variable is read for a list of spawn ids. The variable is reread   
   whenever it changes. This provides a way of changing the I/O source while the command is in execution. Spawn ids provided this way 
   are called "indirect" spawn ids. "

Pedro Alves


More information about the Gdb-patches mailing list