GDB/testsuite: Extend the time gdbserver is waited for
authorMaciej W. Rozycki <macro@codesourcery.com>
Tue, 9 Sep 2014 15:06:15 +0000 (16:06 +0100)
committerMaciej W. Rozycki <macro@codesourcery.com>
Tue, 9 Sep 2014 15:06:15 +0000 (16:06 +0100)
Gdbserver support code uses the global timeout value to determine when
to stop waiting for a gdbserver process being started to respond before
continuing anyway.  This timeout is usually as low as 10s and may not
be enough in this context, for example on the first run where the
filesystem cache is cold, even if it is elsewhere.

E.g. I observe this reliably with gdbserver started the first time in
QEMU running in the system emulation mode:

(gdb) file .../gdb.base/advance
Reading symbols from .../gdb.base/advance...done.
(gdb) delete breakpoints
(gdb) info breakpoints
No breakpoints or watchpoints.
(gdb) break main
Breakpoint 1 at 0x87f8: file .../gdb.base/advance.c,
line 41.
(gdb) set remotetimeout 15
(gdb) kill
The program is not being run.
(gdb)
[...]
.../bin/gdbserver --once :6014 advance
target remote localhost:6014
Remote debugging using localhost:6014
Remote communication error.  Target disconnected.: Connection reset by peer.
(gdb) continue
The program is not being run.
(gdb) Process advance created; pid = 999
Listening on port 6014
FAIL: gdb.base/advance.exp: Can't run to main

-- notice how the test harness proceeded with the `target remote ...'
command even though gdbserver hasn't completed its startup yet.  A
while later when it's finally ready it's too late already.  I checked
the timing here and it takes gdbserver roughly 25 seconds to start in
this scenario.  Subsequent gdbserver starts in the same test run take
less time and usually complete within 10 seconds although occasionally
`target remote ...' precedes the corresponding `Listening on port...'
message again.

Therefore I have fixed this problem by setting an explicit timeout to
120s on the expect call in question.  If this turns out too arbitrary
sometime, then perhaps a separate `gdbserver_timeout' setting might be
due.

* lib/gdbserver-support.exp (gdbserver_start): Set timeout to
120 on waiting for the TCP socket to open.

gdb/testsuite/ChangeLog
gdb/testsuite/lib/gdbserver-support.exp

index 3fc26805a86baa9e37ef0f9f7d9dd18225305d99..4d2933c4e1c1d68f83f32d02ca145d8cfe8d6f8a 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-09  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       * lib/gdbserver-support.exp (gdbserver_start): Set timeout to
+       120 on waiting for the TCP socket to open.
+
 2014-09-09  Doug Evans  <xdje42@gmail.com>
 
        * gdb.base/default.exp (show_conv_list): Add _caller_is,
index 8c91e281f2268611e79361bda71b5d23ba2c2278..e3cae631b1eb08afa125de0dc723f348aa13e324 100644 (file)
@@ -275,6 +275,7 @@ proc gdbserver_start { options arguments } {
        # Wait for the server to open its TCP socket, so that GDB can connect.
        expect {
            -i $server_spawn_id
+           -timeout 120
            -notransfer
            -re "Listening on" { }
            -re "Can't bind address: Address already in use\\.\r\n" {