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

Tom de Vries tdevries@suse.de
Wed Sep 16 12:55:33 GMT 2020


On 9/16/20 12:59 PM, Pedro Alves wrote:
> 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.
> 

Done.

> 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. "

OK, then let's try it like this for now.

Committed as attached.

Thanks,
- Tom

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-gdb-testsuite-Detect-gdb-prompt-after-monitor-exit.patch
Type: text/x-patch
Size: 2720 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/gdb-patches/attachments/20200916/5849f6a6/attachment.bin>


More information about the Gdb-patches mailing list