This is the mail archive of the gdb-cvs@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]

[binutils-gdb] Testsuite: Catch gdbserver socket listen errors


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=01abb042af3f118a8820517a3b45b19e65c7bbd4

commit 01abb042af3f118a8820517a3b45b19e65c7bbd4
Author: Alan Hayward <alan.hayward@arm.com>
Date:   Thu Feb 28 17:19:46 2019 +0000

    Testsuite: Catch gdbserver socket listen errors
    
    When launching gdbserver, the testsuite checks for binding failure but
    does not check for failure to listen to socket error (which can happen
    due to another gdbserver binding to the socket at the same time).
    
    When this error occurs, the test will ignore the error and connect GDB
    to the failed port.  This may succeed and GDB will now be connected to
    the gdbserver from another test.  This eventually causes both tests to
    fail.
    
    When running the tests suite with native-gdbserver across many cores,
    this issue may happen once or twice, each causing random failures for
    two .exp testscripts.
    
    Example gdb.log output for the failure:
    
    The testsuite sucessfully notices a failure to connect to port 2348.
    It launches again with port 2349, which also fails.  The testsuite
    ignores this error and uses gdb to connect to the port - which succeeds.
    
    spawn /work/build/gdb/testsuite/../gdbserver/gdbserver --once localhost:2348 /work/build/gdb/testsuite/outputs/gdb.ada/arrayidx/p^M
    Can't bind address: Address already in use.^M
    Exiting^M
    Port 2348 is already in use.
    spawn /work/build/gdb/testsuite/../gdbserver/gdbserver --once localhost:2349 /work/build/gdb/testsuite/outputs/gdb.ada/arrayidx/p^M
    Can't listen on socket: Address already in use.^M
    Exiting^M
    target remote localhost:2349^M
    Remote debugging using localhost:2349^M
    Reading /lib/ld-linux-aarch64.so.1 from remote target...^M
    warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.^M
    Reading /lib/ld-linux-aarch64.so.1 from remote target...^M
    Reading symbols from target:/lib/ld-linux-aarch64.so.1...^M
    Reading /lib/ld-2.23.so from remote target...^M
    Reading /lib/.debug/ld-2.23.so from remote target...^M
    Reading /work/build/install/lib/debug//lib/ld-2.23.so from remote target...^M
    Reading /work/build/install/lib/debug/lib//ld-2.23.so from remote target...^M
    Reading target:/work/build/install/lib/debug/lib//ld-2.23.so from remote target...^M
    (No debugging symbols found in target:/lib/ld-linux-aarch64.so.1)^M
    0x0000ffffbf6d2cc0 in ?? () from target:/lib/ld-linux-aarch64.so.1^M
    (gdb) continue^M
    Continuing.^M
    Reading /lib/aarch64-linux-gnu/libc.so.6 from remote target...^M
    Reading /lib/aarch64-linux-gnu/libc-2.23.so from remote target...^M
    Reading /lib/aarch64-linux-gnu/.debug/libc-2.23.so from remote target...^M
    Reading /work/build/install/lib/debug//lib/aarch64-linux-gnu/libc-2.23.so from remote target...^M
    Reading /work/build/install/lib/debug/lib/aarch64-linux-gnu//libc-2.23.so from remote target...^M
    Reading target:/work/build/install/lib/debug/lib/aarch64-linux-gnu//libc-2.23.so from remote target...^M
    [Inferior 1 (process 35351) exited normally]^M
    (gdb) FAIL: gdb.ada/arrayidx.exp: can't run to main
    
    Meanwhile, at the same time, in another test, gdbserver successfully
    connects to port 2349.  GDB then tries to connect to the port, but it
    times out because the GDB in the test above has already connected to it.
    
    spawn /work/build/gdb/testsuite/../gdbserver/gdbserver --once localhost:2348 /work/build/gdb/testsuite/outputs/gdb.ada/rdv_wait/foo^M
    Can't bind address: Address already in use.^M
    Exiting^M
    Port 2348 is already in use.
    spawn /work/build/gdb/testsuite/../gdbserver/gdbserver --once localhost:2349 /work/build/gdb/testsuite/outputs/gdb.ada/rdv_wait/foo^M
    Process /work/build/gdb/testsuite/outputs/gdb.ada/rdv_wait/foo created; pid = 65162^M
    Listening on port 2349^M
    Remote debugging from host 127.0.0.1, port 45154^M
    target remote localhost:2349^M
    localhost:2349: Connection timed out.^M
    (gdb) ^CQuit^M
    (gdb) task 2^M
    Cannot inspect Ada tasks when program is not running^M
    
    gdb/testsuite/ChangeLog:
    
    	* lib/gdbserver-support.exp (gdbserver_start): Check for listen
    	failure.

Diff:
---
 gdb/testsuite/ChangeLog                 | 5 +++++
 gdb/testsuite/lib/gdbserver-support.exp | 2 +-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 694920b..73d16f4 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-28  Alan Hayward  <alan.hayward@arm.com>
+
+        * lib/gdbserver-support.exp (gdbserver_start): Check for listen
+        failure.
+
 2019-02-28  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 	PR gdb/8527
diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp
index 05234c4..dbd885a 100644
--- a/gdb/testsuite/lib/gdbserver-support.exp
+++ b/gdb/testsuite/lib/gdbserver-support.exp
@@ -317,7 +317,7 @@ proc gdbserver_start { options arguments } {
 	    -timeout 120
 	    -notransfer
 	    -re "Listening on" { }
-	    -re "Can't bind address: Address already in use\\.\r\n" {
+	    -re "Can't (bind address|listen on socket): Address already in use\\.\r\n" {
 		verbose -log "Port $portnum is already in use."
 		if ![target_info exists gdb,socketport] {
 		    # Bump the port number to avoid the conflict.


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