gdbserver/ada testing broken (was: Re: [pushed] Fix gdbserver/MI testing regression)

Pedro Alves
2016-06-30T12:10:50Z

BTW, while testing this, I noticed that all gdb.ada/ tests that build
a binary with the same name as their test directory are broken.
I suspect this is a regression caused by one of the gdb_remote_download,
etc. patches.

For example:

Running /home/pedro/gdb/mygit/src/gdb/testsuite/gdb.ada/formatted_ref.exp ...
PASS: gdb.ada/formatted_ref.exp: compilation formatted_ref.adb
FAIL: gdb.ada/formatted_ref.exp: print/x s
FAIL: gdb.ada/formatted_ref.exp: print/x s'access
FAIL: gdb.ada/formatted_ref.exp: print s.x = 13

gdb.log shows:

The program is not being run.
(gdb) file /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.ada/formatted_ref/formatted_ref/formatted_ref
Reading symbols from /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.ada/formatted_ref/formatted_ref/formatted_ref...done.
...
(gdb) spawn ../gdbserver/gdbserver --once :2346 /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.ada/formatted_ref/formatted_ref
Process /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.ada/formatted_ref/formatted_ref created; pid = 7553
Cannot exec /home/pedro/brno/pedro/gdb/mygit/build/gdb/testsuite/outputs/gdb.ada/formatted_ref/formatted_ref: Permission denied.

Child exited with status 127
No program to debug

Note how gdb loads:

.../gdb.ada/formatted_ref/formatted_ref/formatted_ref

while gdbserver tries to load:

.../gdb.ada/formatted_ref/formatted_ref

... which fails because it's the directory.

This is probably because gdb_remote_download only minds "tail" when
deciding the destination filename:

proc gdb_remote_download {dest fromfile {tofile {}}} {
# If TOFILE is not given, default to the same filename as FROMFILE.
if {[string length $tofile] == 0} {
set tofile [file tail $fromfile]
}

if {[is_remote $dest]} {
# When the DEST is remote, we simply send the file to DEST.
global cleanfiles

set destname [remote_download $dest $fromfile $tofile]
lappend cleanfiles $destname

return $destname

and then gdbserver-base.exp does:

proc ${board}_download { board host dest } {
# We pass DEST in standard_output_file, regardless of whether it is absolute
# or relative, because we don't want the tests to be able to write outside
# their standard output directory.
set dest [standard_output_file $dest]

file copy -force $host $dest

return $dest
}

Here $dest already exists when we get here -- it's the directory.

I haven't confirmed, just inspected the code.

Not sure exactly what the best fix is. Maybe simply tweak
the tests to never get into this situation, along with
making standard_ada_testfile issue perror when it happens?

Most tests pass an explicit base_file name to standard_ada_testfile
that avoids the conflict, like:

gdb.ada/str_ref_cmp.exp:18:standard_ada_testfile foo

Maybe standard_ada_testfile's $base_file parameter should be
defaulted, like:

-proc standard_ada_testfile {base_file {dir ""}} {
+proc standard_ada_testfile {{base_file "test"} {dir ""}} {

and then most tests adjusted to not pass an explicit
base_file at all.

Thanks,
Pedro Alves