gdb/testsuite: avoid reading files through the remote protocol in gdb.server/*.exp
authorSimon Marchi <simon.marchi@efficios.com>
Mon, 4 Jan 2021 16:43:59 +0000 (11:43 -0500)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 4 Jan 2021 16:43:59 +0000 (11:43 -0500)
When I run some tests in gdb.server (fox example
gdb.server/ext-attach.exp) on Ubuntu 20.04 with separate debug info for
glibc installed, they often time out.  This is because GDB reads the
debug info through the remote protocol which is particularly slow:

    attach 316937
    Attaching to program: /home/smarchi/build/binutils-gdb-all-targets/gdb/testsuite/outputs/gdb.server/ext-attach/ext-attach, process 316937
    Reading /lib/x86_64-linux-gnu/libc.so.6 from remote target...
    warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
    Reading /lib64/ld-linux-x86-64.so.2 from remote target...
    Reading symbols from target:/lib/x86_64-linux-gnu/libc.so.6...
    Reading /lib/x86_64-linux-gnu/libc-2.31.so from remote target...
    Reading /lib/x86_64-linux-gnu/.debug/libc-2.31.so from remote target...
    Reading /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.31.so from remote target...
    FAIL: gdb.server/ext-attach.exp: attach to remote program 1 (timeout)

This is avoided in gdbserver boards by adding "set sysroot" to GDBFLAGS
(see boards/local-board.exp), which makes GDB read files from the local
filesystem.  But gdb.server tests spawn GDBserver directly, so are ran
even when using the default unix board, where the "set sysroot" isn't
used.

Modify these tests to append "set sysroot" to the GDBFLAGS, a bit like
lib/local-board.exp does.

One special case is gdb.server/sysroot.exp, whose intent is to test
different "set sysroot" values.  For this one, increase the timeout when
testing the "target:" sysroot.

gdb/testsuite/ChangeLog:

* gdb.server/abspath.exp: Append "set sysroot" to GDBFLAGS.
* gdb.server/connect-without-multi-process.exp: Likewise.
* gdb.server/exit-multiple-threads.exp: Likewise.
* gdb.server/ext-attach.exp: Likewise.
* gdb.server/ext-restart.exp: Likewise.
* gdb.server/ext-run.exp: Likewise.
* gdb.server/ext-wrapper.exp: Likewise.
* gdb.server/multi-ui-errors.exp: Likewise.
* gdb.server/no-thread-db.exp: Likewise.
* gdb.server/reconnect-ctrl-c.exp: Likewise.
* gdb.server/run-without-local-binary.exp: Likewise.
* gdb.server/server-kill.exp: Likewise.
* gdb.server/server-run.exp: Likewise.
* gdb.server/solib-list.exp: Likewise.
* gdb.server/stop-reply-no-thread.exp: Likewise.
* gdb.server/wrapper.exp: Likewise.
* gdb.server/sysroot.exp: Increase timeout when testing the
target: sysroot.

Change-Id: I7451bcc737f90e2cd0b977e9f09da3710774b0bf

18 files changed:
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.server/abspath.exp
gdb/testsuite/gdb.server/connect-without-multi-process.exp
gdb/testsuite/gdb.server/exit-multiple-threads.exp
gdb/testsuite/gdb.server/ext-attach.exp
gdb/testsuite/gdb.server/ext-restart.exp
gdb/testsuite/gdb.server/ext-run.exp
gdb/testsuite/gdb.server/ext-wrapper.exp
gdb/testsuite/gdb.server/multi-ui-errors.exp
gdb/testsuite/gdb.server/no-thread-db.exp
gdb/testsuite/gdb.server/reconnect-ctrl-c.exp
gdb/testsuite/gdb.server/run-without-local-binary.exp
gdb/testsuite/gdb.server/server-kill.exp
gdb/testsuite/gdb.server/server-run.exp
gdb/testsuite/gdb.server/solib-list.exp
gdb/testsuite/gdb.server/stop-reply-no-thread.exp
gdb/testsuite/gdb.server/sysroot.exp
gdb/testsuite/gdb.server/wrapper.exp

index ac4b6e1e55c17feebb7e2e1eea969b12b753f5b6..44afe3629b58842051d6f752a9276fd24b7b8b5a 100644 (file)
@@ -1,3 +1,24 @@
+2021-01-04  Simon Marchi  <simon.marchi@efficios.com>
+
+       * gdb.server/abspath.exp: Append "set sysroot" to GDBFLAGS.
+       * gdb.server/connect-without-multi-process.exp: Likewise.
+       * gdb.server/exit-multiple-threads.exp: Likewise.
+       * gdb.server/ext-attach.exp: Likewise.
+       * gdb.server/ext-restart.exp: Likewise.
+       * gdb.server/ext-run.exp: Likewise.
+       * gdb.server/ext-wrapper.exp: Likewise.
+       * gdb.server/multi-ui-errors.exp: Likewise.
+       * gdb.server/no-thread-db.exp: Likewise.
+       * gdb.server/reconnect-ctrl-c.exp: Likewise.
+       * gdb.server/run-without-local-binary.exp: Likewise.
+       * gdb.server/server-kill.exp: Likewise.
+       * gdb.server/server-run.exp: Likewise.
+       * gdb.server/solib-list.exp: Likewise.
+       * gdb.server/stop-reply-no-thread.exp: Likewise.
+       * gdb.server/wrapper.exp: Likewise.
+       * gdb.server/sysroot.exp: Increase timeout when testing the
+       target: sysroot.
+
 2021-01-04  Simon Marchi  <simon.marchi@efficios.com>
 
        * gdb.server/server-run.exp: Use clean_restart.
index f14bd90b8b87cc09295cdeca8acb4dcf725f06ab..1ccdbe7ac1cc82e7b5d2f31d07b05b9822a06501 100644 (file)
@@ -33,8 +33,17 @@ if { [is_remote target] } {
     return 0
 }
 
-if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol (the `is_remote target` check is
+    # already done above).
+    if { ![is_remote host] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index c36bd9b82d901281adea73fab80ca4510fd06867..9c03d1280e158b12b58e4d4445affbbc0963dda5 100644 (file)
@@ -31,9 +31,17 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
 # Test spawning gdbserver with a program, connect to it and run to
 # main, with both multiprocess extensions on and off.
 proc do_test {multiprocess} {
-    global binfile
+    global binfile GDBFLAGS
 
-    clean_restart $binfile
+    save_vars { GDBFLAGS } {
+       # If GDB and GDBserver are both running locally, set the sysroot to avoid
+       # reading files via the remote protocol.
+       if { ![is_remote host] && ![is_remote target] } {
+           set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+       }
+
+       clean_restart $binfile
+    }
 
     # Make sure we're disconnected, in case we're testing with an
     # extended-remote board, therefore already connected.
index c0db6e9cd674369d438c685c9e90b43d464bcdeb..a74f7d124490cfc6e721fb2dfac0de299bb914f2 100644 (file)
@@ -39,7 +39,17 @@ standard_testfile
 # Places a breakpoint in function 'breakpt' and then continues to the
 # breakpoint, at which point it runs 'info threads'.
 proc prepare_for_test { executable disable_multi_process } {
-    clean_restart ${executable}
+    global GDBFLAGS
+
+    save_vars { GDBFLAGS } {
+       # If GDB and GDBserver are both running locally, set the sysroot to avoid
+       # reading files via the remote protocol.
+       if { ![is_remote host] && ![is_remote target] } {
+           set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+       }
+
+       clean_restart ${executable}
+    }
 
     # Make sure we're disconnected, in case we're testing with an
     # extended-remote board, therefore already connected.
index 94695179ddab90a4d70c7f89cbf9414aa25b00df..c9766e3531775f8147a088e9eeacbbce782e5ae4 100644 (file)
@@ -30,8 +30,16 @@ if {![can_spawn_for_attach]} {
     return 0
 }
 
-if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index 33b134053918c2ba79cf6ba9349ca34f470a2689..8b175e75a772a4f93cb15d8f12e3810aab6b2d9f 100644 (file)
@@ -25,8 +25,16 @@ if { [skip_gdbserver_tests] } {
     return 0
 }
 
-if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index 92aef1417843ee04d909174ccfd3110190db729d..268f690949a2324c313f55037e33753807da81ff 100644 (file)
@@ -32,7 +32,15 @@ if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
 # gdb_skip_xml_test must be called while gdb is not running.
 set do_xml_test [expr ![gdb_skip_xml_test]]
 
-clean_restart $binfile
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    clean_restart $binfile
+}
 
 # Make sure we're disconnected, in case we're testing with an
 # extended-remote board, therefore already connected.
index c6e7786af42e3cc15e9f8498a4c837df576f59da..fc9a77f137c1ebb4a5fb728015287ff795543e95 100644 (file)
@@ -27,8 +27,16 @@ if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
     return -1
 }
 
-if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index b89defc1ff49f90dacbbb32a9dacef684f402980..073192f19719d99a3aab88a25a455dde750312d3 100644 (file)
@@ -28,8 +28,16 @@ if {[skip_gdbserver_tests]} {
     return 0
 }
 
-if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index 5dbb65469bb80c0f0a672ef4670a806e448fc102..19ec89a822f3b0d7b101b91c0af9b2302117237c 100644 (file)
@@ -33,7 +33,15 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executab
     return -1
 }
 
-clean_restart ${testfile}
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    clean_restart ${testfile}
+}
 
 # Make sure we're disconnected, in case we're testing with an
 # extended-remote board, therefore already connected.
index 9b5b7a83328073a927067a9c30d04a136720136f..11aa5147c78af41e62b5ca722d524b8a3346a8a9 100644 (file)
@@ -30,8 +30,17 @@ if [target_info exists gdb,nointerrupts] {
 }
 
 standard_testfile
-if [prepare_for_testing "failed to prepare" $testfile $srcfile] {
-    return -1
+
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if [prepare_for_testing "failed to prepare" $testfile $srcfile] {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an
index 6bbdca278c604f2f6a5fb0526b7aa32609b1bac2..395eddc9106433082fa0c840a10ef4f6156175be 100644 (file)
@@ -31,6 +31,13 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
 # remote/21852.
 save_vars { GDBFLAGS } {
     set GDBFLAGS ""
+
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "-ex \"set sysroot\""
+    }
+
     gdb_exit
     gdb_start
 
index ab82072138a8a58d1112bc97775191ff38d8a55f..80d78f89738198ba996ad0b071080c143dd768f4 100644 (file)
@@ -36,8 +36,17 @@ if { [build_executable "failed to prepare" ${testfile}] } {
 proc prepare {} {
     global binfile gdb_prompt srcfile decimal
     global server_pid
+    global GDBFLAGS
 
-    clean_restart $binfile
+    save_vars { GDBFLAGS } {
+       # If GDB and GDBserver are both running locally, set the sysroot to avoid
+       # reading files via the remote protocol.
+       if { ![is_remote host] && ![is_remote target] } {
+           set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+       }
+
+       clean_restart $binfile
+    }
 
     # Make sure we're disconnected, in case we're testing with an
     # extended-remote board, therefore already connected.
index 72ba02c977ce1c96308d81aea7aba1f2b22522c7..e680ef500356f4e36c23156ff767dfb574281643 100644 (file)
@@ -29,7 +29,15 @@ if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
     return -1
 }
 
-clean_restart $binfile
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    clean_restart $binfile
+}
 
 # Make sure we're disconnected, in case we're testing with an
 # extended-remote board, therefore already connected.
index c4934ed1416888b6cfa7bf23aaa838317db815ac..3a8c739dd7b9f454723f710cd9540cedbbe8fc8b 100644 (file)
@@ -42,7 +42,16 @@ set interp_system [section_get ${binfile} .interp]
 verbose -log "system interpreter is: $interp_system"
 
 foreach nonstop { 0 1 } { with_test_prefix "non-stop $nonstop" {
-    clean_restart
+    save_vars { GDBFLAGS } {
+       # If GDB and GDBserver are both running locally, set the sysroot to avoid
+       # reading files via the remote protocol.
+       if { ![is_remote host] && ![is_remote target] } {
+           set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+       }
+
+       clean_restart
+    }
+
     gdb_load_shlib ${binlibfile}
 
     set remote_binfile [gdb_remote_download target $binfile]
index 5e93b4770aa8e4d71156ee5daa73ed6d99cb6c88..68bf42ac1a0001175c6f7c128055adca517690d2 100644 (file)
@@ -34,9 +34,17 @@ if { [build_executable "failed to prepare" $testfile $srcfile] == -1 } {
 
 # Run the tests with different features of GDBserver disabled.
 proc run_test { disable_feature target_nonstop } {
-    global binfile gdb_prompt decimal
+    global binfile gdb_prompt decimal GDBFLAGS
 
-    clean_restart ${binfile}
+    save_vars { GDBFLAGS } {
+       # If GDB and GDBserver are both running locally, set the sysroot to avoid
+       # reading files via the remote protocol.
+       if { ![is_remote host] && ![is_remote target] } {
+           set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+       }
+
+       clean_restart ${binfile}
+    }
 
     # Make sure we're disconnected, in case we're testing with an
     # extended-remote board, therefore already connected.
index 158b7c5d0b8c734ec06e64448e6829c7dfec55e2..5aea60a526b3fc0ab52fe92679e12feb62f4904f 100644 (file)
@@ -40,39 +40,45 @@ foreach_with_prefix sysroot { "local" "remote" } {
     if { $sysroot == "local" } {
        set sysroot_command "/"
        set reading_symbols "Reading symbols from $binfile..."
+       set timeout_factor 1
     } else {
        set sysroot_command "target:"
        set reading_symbols "Reading $binfile from remote target..."
+       set timeout_factor 5
     }
 
-    # Restart GDB.
-    clean_restart
+    # Reading debug info from the remote target can take a bit of time, so
+    # increase the timeout in that case.
+    with_timeout_factor $timeout_factor {
+       # Restart GDB.
+       clean_restart
 
-    # Make sure we're disconnected, in case we're testing with an
-    # extended-remote board, therefore already connected.
-    gdb_test "disconnect" ".*"
+       # 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]
+       # 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_command"
+       # Set the sysroot.
+       gdb_test_no_output "set sysroot $sysroot_command"
 
-    # Connect to gdbserver, making sure GDB reads in the binary correctly.
-    set test "connect to remote and read binary"
-    if {[gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport $reading_symbols] == 0} {
-       pass $test
-    } else {
-       fail $test
-    }
+       # Connect to gdbserver, making sure GDB reads in the binary correctly.
+       set test "connect to remote and read binary"
+       if {[gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport $reading_symbols] == 0} {
+           pass $test
+       } else {
+           fail $test
+       }
 
-    gdb_breakpoint main
-    gdb_test "continue" "Breakpoint $decimal.* main.*" "continue to main"
+       gdb_breakpoint main
+       gdb_test "continue" "Breakpoint $decimal.* main.*" "continue to main"
 
-    # Test that we can stop inside a library.
-    gdb_breakpoint printf
-    gdb_test "continue" "Breakpoint $decimal.* (__)?printf .*" \
-       "continue to printf"
+       # Test that we can stop inside a library.
+       gdb_breakpoint printf
+       gdb_test "continue" "Breakpoint $decimal.* (__)?printf .*" \
+           "continue to printf"
+    }
 }
index 695deea174dc5aaca48cd270daff3f1ed40c49a1..27d37bac02e2c96aa75d07d91285b05c113e1cd7 100644 (file)
@@ -31,8 +31,16 @@ if { [istarget *-*-mingw*]
     return -1
 }
 
-if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
-    return -1
+save_vars { GDBFLAGS } {
+    # If GDB and GDBserver are both running locally, set the sysroot to avoid
+    # reading files via the remote protocol.
+    if { ![is_remote host] && ![is_remote target] } {
+       set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
+    }
+
+    if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
+       return -1
+    }
 }
 
 # Make sure we're disconnected, in case we're testing with an