This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][gdb/testsuite] Log wait status on process no longer exists error


Tom de Vries <tdevries@suse.de> writes:

> Btw, I noticed that gdb_test_multiple emits an "ERROR: Process no longer
> exists" preceding the unresolved message, but does not give details
> about the process exit status, which might be helpful.
>
> How about this patch?
>
> Thanks,
> - Tom

Hello,

I noticed that in certain cases the wait call used to find out the exit
status can hang forever waiting for the GDB process, due to a dejagnu
oddity.

The gdb_test_multiple procedure uses gdb_expect, which itself uses
remote_expect (provided by dejagnu).  The remote_expect procedure parses
the expect body passed to it and uses the eof block as a "default" case
to be executed in case of an error, which means that it can be executed
even when there was no actual eof and the GDB process is still running.

You can see this happen with a testcase like:

gdb_start

gdb_test_multiple "show version" "show version" {
    -re ".*" {
	error "forced error"
    }
}

I'm not sure how to solve this.  This was triggered by some testcases
when gdbserver failed to start, the testcases don't check this and use
the gdbserver spawn_id even though it no longer exists, which is what
causes the error to be raised.  This gdbserver issue has been fixed
since, so for now this will probably not happen.

Thanks!

--
Pedro Franco de Carvalho

> [gdb/testsuite] Log wait status on process no longer exists error
>
> Proc gdb_test_multiple can run into a process no longer exists error, but when
> that happens it shows no details about the process:
> ...
> ERROR: Process no longer exists
> ...
>
> Fix this by showing the wait status of the process in the log:
> ...
> ERROR: Gdb process no longer exists
> Gdb process exited with wait status 8106 exp8 0 0 CHILDKILLED SIGSEGV \
>   {segmentation violation}
> ...
>
> In order to run the wait commmand we need an explicit pid, so we can't use
> any_spawn_id, and duplicate the "-i any_spawn_id eof" patter for gdb_spawn_id,
> and add the wait status logging there.
>
> Build and tested on x86_64-linux.
>
> 2018-10-24  Tom de Vries  <tdevries@suse.de>
>
> 	* lib/gdb.exp (gdb_test_multiple): Log wait status on process no
> 	longer exists error.
>
> ---
>  gdb/testsuite/lib/gdb.exp | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index 2d197d9b5c..f68664b0ef 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -980,6 +980,16 @@ proc gdb_test_multiple { command message user_code } {
>  	    set result -1
>  	}
>
> +	-i $gdb_spawn_id
> +	eof {
> +	    perror "Gdb process no longer exists"
> +	    verbose -log "Gdb process exited with wait status [wait -i $gdb_spawn_id]"
> +	    if { $message != "" } {
> +		fail "$message"
> +	    }
> +	    return -1
> +	}
> +
>  	# Patterns below apply to any spawn id specified.
>  	-i $any_spawn_id
>  	eof {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]