Testsuite: Add gdbserver sysroot test

Message ID 20190408153440.39250-1-alan.hayward@arm.com
State New, archived
Headers

Commit Message

Alan Hayward April 8, 2019, 3:34 p.m. UTC
  The local board file ensures that the sysroot is always set to load
files from the local filesystem.

Add a gdbserver test to explicitly test the sysroot set to both the
remote target and the local filesystem.

gdb/testsuite/ChangeLog:

2019-04-08  Alan Hayward  <alan.hayward@arm.com>

	* gdb.server/sysroot.c: New test.
	* gdb.server/sysroot.exp: New file.
---
 gdb/testsuite/gdb.server/sysroot.c   | 25 +++++++++++++
 gdb/testsuite/gdb.server/sysroot.exp | 55 ++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 gdb/testsuite/gdb.server/sysroot.c
 create mode 100644 gdb/testsuite/gdb.server/sysroot.exp
  

Comments

Pedro Alves April 8, 2019, 6:58 p.m. UTC | #1
Hi Alan,

Thanks for following through.

On 4/8/19 4:34 PM, Alan Hayward wrote:
> The local board file ensures that the sysroot is always set to load
> files from the local filesystem.
> 
> Add a gdbserver test to explicitly test the sysroot set to both the
> remote target and the local filesystem.
> 
> gdb/testsuite/ChangeLog:
> 
> 2019-04-08  Alan Hayward  <alan.hayward@arm.com>
> 
> 	* gdb.server/sysroot.c: New test.
> 	* gdb.server/sysroot.exp: New file.
> ---
>  gdb/testsuite/gdb.server/sysroot.c   | 25 +++++++++++++
>  gdb/testsuite/gdb.server/sysroot.exp | 55 ++++++++++++++++++++++++++++
>  2 files changed, 80 insertions(+)
>  create mode 100644 gdb/testsuite/gdb.server/sysroot.c
>  create mode 100644 gdb/testsuite/gdb.server/sysroot.exp
> 
> diff --git a/gdb/testsuite/gdb.server/sysroot.c b/gdb/testsuite/gdb.server/sysroot.c
> new file mode 100644
> index 0000000000..6fc1443e3b
> --- /dev/null
> +++ b/gdb/testsuite/gdb.server/sysroot.c
> @@ -0,0 +1,25 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2019 Free Software Foundation, Inc.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdio.h>
> +
> +int
> +main ()
> +{
> +  printf("Hello World!\n");
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.server/sysroot.exp b/gdb/testsuite/gdb.server/sysroot.exp
> new file mode 100644
> index 0000000000..9db833fc7e
> --- /dev/null
> +++ b/gdb/testsuite/gdb.server/sysroot.exp
> @@ -0,0 +1,55 @@
> +# This testcase is part of GDB, the GNU debugger.
> +#
> +# Copyright 2019 Free Software Foundation, Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +# Test GDB can correct read the binary with different sysroot setups.
> +
> +load_lib gdbserver-support.exp
> +
> +if { [skip_gdbserver_tests] } {
> +    verbose "skipping gdbserver tests"
> +    return -1
> +}
> +
> +standard_testfile
> +if [prepare_for_testing "failed to prepare" $testfile $srcfile "additional_flags=--no-builtin"] {
> +    return -1
> +}
> +
> +# Run once with sysroot set to the remote target and once to the local filesystem.
> +foreach_with_prefix sysroot {"target:" "/"} {
> +
> +    # Make sure we're disconnected, in case we're testing with an
> +    # extended-remote board, therefore already connected.
> +    gdb_test "disconnect" ".*"
> +
> +    # Start GDBserver.
> +    set res [gdbserver_start "" $binfile]
> +    set gdbserver_protocol [lindex $res 0]
> +    set gdbserver_gdbport [lindex $res 1]
> +
> +    # Set the sysroot.
> +    gdb_test_no_output "set sysroot $sysroot"
> +
> +    gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport
> +
> +    gdb_breakpoint main
> +    gdb_test "continue" "Breakpoint $decimal.* main.*" "continue to main"
> +
> +    # Test we can stop inside a library.
> +    gdb_breakpoint printf
> +    gdb_test "continue" "Breakpoint $decimal.* printf.*" "continue to printf"
> +}
> 

I'm not sure I understand the overall approach you took here.

Because, if you don't restart between each iteration, then the
second iteration is using the program from the previous connection,
I think?

Also, you've used prepare_for_testing, which results in loading the
program into gdb with the "file" command.

So the main program is not being fetched from the target.

So the testcase is trying to ensure that we load the DSOs from
the target, right?

But the thing is, even if you don't have debug info for shared libraries, if you
debug info for the main program, you'll be able to set a breakpoint on "printf".
The result is you end up with a breakpoint at printf@plt.  So I'm thinking that
the test would pass even if we failed to load the shared libraries from the target.

I tried to do that manually, by issuing a "nosharedlibrary" after connecting
to gdbserver, and then running to the breakpoint, but unfortunately, that
runs into a nasty gdb bug:

 (gdb) nosharedlibrary 
 (gdb) c
 Continuing.
 pure virtual method called
 terminate called without an active exception
 Aborted (core dumped)
 $

I'm looking into that...

Also, the test as is fails for me, on x86-64:

 set sysroot /
 warning: Could not load shared library symbols for linux-vdso.so.1.
 Do you need "set solib-search-path" or "set sysroot"?
 (gdb) FAIL: gdb.server/sysroot.exp: sysroot=/: set sysroot /

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/testsuite/gdb.server/sysroot.c b/gdb/testsuite/gdb.server/sysroot.c
new file mode 100644
index 0000000000..6fc1443e3b
--- /dev/null
+++ b/gdb/testsuite/gdb.server/sysroot.c
@@ -0,0 +1,25 @@ 
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+
+int
+main ()
+{
+  printf("Hello World!\n");
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.server/sysroot.exp b/gdb/testsuite/gdb.server/sysroot.exp
new file mode 100644
index 0000000000..9db833fc7e
--- /dev/null
+++ b/gdb/testsuite/gdb.server/sysroot.exp
@@ -0,0 +1,55 @@ 
+# This testcase is part of GDB, the GNU debugger.
+#
+# Copyright 2019 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test GDB can correct read the binary with different sysroot setups.
+
+load_lib gdbserver-support.exp
+
+if { [skip_gdbserver_tests] } {
+    verbose "skipping gdbserver tests"
+    return -1
+}
+
+standard_testfile
+if [prepare_for_testing "failed to prepare" $testfile $srcfile "additional_flags=--no-builtin"] {
+    return -1
+}
+
+# Run once with sysroot set to the remote target and once to the local filesystem.
+foreach_with_prefix sysroot {"target:" "/"} {
+
+    # Make sure we're disconnected, in case we're testing with an
+    # extended-remote board, therefore already connected.
+    gdb_test "disconnect" ".*"
+
+    # Start GDBserver.
+    set res [gdbserver_start "" $binfile]
+    set gdbserver_protocol [lindex $res 0]
+    set gdbserver_gdbport [lindex $res 1]
+
+    # Set the sysroot.
+    gdb_test_no_output "set sysroot $sysroot"
+
+    gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport
+
+    gdb_breakpoint main
+    gdb_test "continue" "Breakpoint $decimal.* main.*" "continue to main"
+
+    # Test we can stop inside a library.
+    gdb_breakpoint printf
+    gdb_test "continue" "Breakpoint $decimal.* printf.*" "continue to printf"
+}