From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26620 invoked by alias); 22 Jun 2003 04:23:28 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 20804 invoked from network); 22 Jun 2003 04:22:29 -0000 Received: from unknown (HELO crack.them.org) (146.82.138.56) by sources.redhat.com with SMTP; 22 Jun 2003 04:22:29 -0000 Received: from dsl093-172-017.pit1.dsl.speakeasy.net ([66.93.172.17] helo=nevyn.them.org ident=mail) by crack.them.org with asmtp (Exim 3.12 #1 (Debian)) id 19TwNs-00071O-00 for ; Sat, 21 Jun 2003 23:23:21 -0500 Received: from drow by nevyn.them.org with local (Exim 3.36 #1 (Debian)) id 19TwN0-0006c9-00 for ; Sun, 22 Jun 2003 00:22:26 -0400 Date: Sun, 22 Jun 2003 04:23:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Subject: [RFA: mi testsuite] Gdbserver support for the MI testsuite Message-ID: <20030622042226.GA25362@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable User-Agent: Mutt/1.5.1i X-SW-Source: 2003-06/txt/msg00690.txt.bz2 Updated and improved version of a patch I've posted several times over the last year and a half or so. This adds support for gdbserver-style remote stubs to the MI testsuite; the differences between the MI support and non-MI support are mostly cosmetic at this point (i.e. it doesn't go out of its way to use -target-select). Just handles the different prompt. There's still an unnecessary restart of gdbserver every test; fixing that is going to take some serious work. Results with the patch are OK: linux-proc tests fail, not surprisingly; gcore fails; there are some new thread failures since I last updated it which I will have to investigate. But most of the MI tests pass instead of timing out. Does this patch look OK for 6.0? --=20 Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2003-06-22 Daniel Jacobowitz * config/gdbserver.exp (gdb_load): Rename to gdbserver_gdb_load. Add an "mi" flag argument. Handle the MI prompt and quoting. Use mi_gdb_file_cmd and mi_gdb_target_cmd. Redirect gdbserver output to /dev/null. (gdb_load, mi_gdb_load): New wrappers for gdbserver_gdb_load. * config/monitor.exp (mi_gdb_target_cmd): New function, based on gdb_target_cmd. * lib/gdb.exp: Require mi-support.exp, so that we can override functions from it in target config files. * lib/mi-support.exp (mi_gdb_file_cmd): New function, broken out from mi_gdb_load. Download binaries to the target. (mi_gdb_load): Call mi_gdb_file_cmd. Index: testsuite/config/gdbserver.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/config/gdbserver.exp,v retrieving revision 1.5 diff -u -p -r1.5 gdbserver.exp --- testsuite/config/gdbserver.exp 19 Jul 2002 19:40:28 -0000 1.5 +++ testsuite/config/gdbserver.exp 22 Jun 2003 04:10:25 -0000 @@ -89,12 +89,13 @@ global server_exec; global portnum; set portnum "2345"; =20 -proc gdb_load { arg } { +proc gdbserver_gdb_load { mi arg } { global host_exec; global server_exec; global portnum; global verbose; global gdb_prompt; + global mi_gdb_prompt; =20 # Port id -- either specified in baseboard file, or managed here. if [target_info exists gdb,socketport] { @@ -138,16 +139,30 @@ proc gdb_load { arg } { if { $arg =3D=3D "" } { if { ! [info exists host_exec] } { send_gdb "info files\n"; - gdb_expect 30 { - -re "Symbols from \"(\[^\"\]+)\"" { - set host_exec $expect_out(1,string); - exp_continue; - } - -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { - set host_exec $expect_out(1,string); - exp_continue; + if { $mi =3D=3D 0 } { + gdb_expect 30 { + -re "Symbols from \"(\[^\"\]+)\"" { + set host_exec $expect_out(1,string); + exp_continue; + } + -re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," { + set host_exec $expect_out(1,string); + exp_continue; + } + -re "$gdb_prompt $" { } + } + } else { + gdb_expect 30 { + -re "~\"Symbols from \\\\\"(\[^\"\]+)\\\\\"\." { + set host_exec $expect_out(1,string); + exp_continue; + } + -re "~\"Local exec file:\\\\n\"\[\r\n\]+~\"\\\\t`(\[^'\]+)'," { + set host_exec $expect_out(1,string); + exp_continue; + } + -re "$mi_gdb_prompt$" { } } - -re "$gdb_prompt $" { } } } } else { @@ -173,8 +188,10 @@ proc gdb_load { arg } { } else { # This flavour of gdbserver takes as arguments the port information # and the name of the executable file to be debugged. + # Redirect output to /dev/null, to prevent write() from blocking + # (since we aren't reading from it, yet.) set server_spawn_id [remote_spawn target \ - "$gdbserver $sockethost$portnum $server_exec"] + "sh -c {$gdbserver $sockethost$portnum $server_exec > /dev/null 2> /d= ev/null}"] }=20 =20 # We can't call close, because if gdbserver is local then that means @@ -187,40 +204,72 @@ proc gdb_load { arg } { =20 # tell gdb what file we are debugging if { $arg !=3D "" } { - if [gdb_file_cmd $arg] { - return -1; + if { $mi =3D=3D 0 } { + if [gdb_file_cmd $arg] { + return -1; + } + } else { + if [mi_gdb_file_cmd $arg] { + return -1; + } } } =20 # attach to the "serial port" - gdb_target_cmd $protocol $gdbport; + if { $mi =3D=3D 0 } { + gdb_target_cmd $protocol $gdbport + } else { + mi_gdb_target_cmd $protocol $gdbport + } =20 # do the real load if needed if [target_info exists gdb_server_do_load] { send_gdb "load\n" set timeout 2400 verbose "Timeout is now $timeout seconds" 2 - gdb_expect { - -re ".*$gdb_prompt $" { - if $verbose>1 then { - send_user "Loaded $arg into $GDB\n" - } - set timeout 30 - verbose "Timeout is now $timeout seconds" 2 - return 1 - } - -re "$gdb_prompt $" { - if $verbose>1 then { - perror "GDB couldn't load." - } - } - timeout { - if $verbose>1 then { - perror "Timed out trying to load $arg." - } - } - } + + if { $mi =3D=3D 0 } { + gdb_expect { + -re ".*$gdb_prompt $" { + if $verbose>1 then { + send_user "Loaded $server_exec into $GDB\n" + } + set timeout 30 + verbose "Timeout is now $timeout seconds" 2 + return 1 + } + timeout { + if $verbose>1 then { + perror "Timed out trying to load $server_exec." + } + } + } + } else { + gdb_expect { + -re ".*$mi_gdb_prompt$" { + if $verbose>1 then { + send_user "Loaded $server_exec into $GDB\n" + } + set timeout 30 + verbose "Timeout is now $timeout seconds" 2 + return 1 + } + timeout { + if $verbose>1 then { + perror "Timed out trying to load $server_exec." + } + } + } + } } =20 return 0; +} + +proc gdb_load { arg } { + gdbserver_gdb_load 0 $arg +} + +proc mi_gdb_load { arg } { + gdbserver_gdb_load 1 $arg } Index: testsuite/config/monitor.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/config/monitor.exp,v retrieving revision 1.5 diff -u -p -r1.5 monitor.exp --- testsuite/config/monitor.exp 15 Mar 2001 21:46:57 -0000 1.5 +++ testsuite/config/monitor.exp 22 Jun 2003 04:10:25 -0000 @@ -71,6 +71,55 @@ proc gdb_target_cmd { targetname serialp } =20 =20 +# Much the same, but for MI. +proc mi_gdb_target_cmd { targetname serialport } { + global mi_gdb_prompt + + for {set i 1} {$i <=3D 3} {incr i} { + send_gdb "target $targetname $serialport\n" + gdb_expect 60 { + -re "Couldn't establish connection to remote.*$mi_gdb_prompt$" { + verbose "Connection failed"; + } + -re "Remote MIPS debugging.*$mi_gdb_prompt$" { + verbose "Set target to $targetname"; + return 0; + } + -re "Remote debugging using .*$serialport.*$mi_gdb_prompt$" { + verbose "Set target to $targetname"; + return 0; + } + -re "Remote target $targetname connected to.*$mi_gdb_prompt$" { + verbose "Set target to $targetname"; + return 0; + } + -re "Connected to.*$mi_gdb_prompt$" {=20 + verbose "Set target to $targetname"; + return 0; + } + -re "Ending remote.*$mi_gdb_prompt$" { } + -re "Connection refused.*$mi_gdb_prompt$" { + verbose "Connection refused by remote target. Pausing, and trying again= ." + sleep 30 + continue + } + -re "Timeout reading from remote system.*$mi_gdb_prompt$" { + verbose "Got timeout error from gdb."; + } + -re "\\^done,.*$mi_gdb_prompt$" { + verbose "Set target to $targetname" + return 0 + } + timeout { + send_gdb "=03"; + break + } + } + } + return 1 +} + + =20 # # gdb_target_monitor Index: testsuite/lib/gdb.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/lib/gdb.exp,v retrieving revision 1.37 diff -u -p -r1.37 gdb.exp --- testsuite/lib/gdb.exp 1 May 2003 01:09:51 -0000 1.37 +++ testsuite/lib/gdb.exp 22 Jun 2003 04:10:25 -0000 @@ -26,6 +26,7 @@ # or by passing arguments. =20 load_lib libgloss.exp +load_lib mi-support.exp =20 global GDB =20 Index: testsuite/lib/mi-support.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/lib/mi-support.exp,v retrieving revision 1.23 diff -u -p -r1.23 mi-support.exp --- testsuite/lib/mi-support.exp 22 Jun 2003 00:04:27 -0000 1.23 +++ testsuite/lib/mi-support.exp 22 Jun 2003 04:10:25 -0000 @@ -282,10 +282,10 @@ proc mi_gdb_reinitialize_dir { subdir }=20 } =20 # -# load a file into the debugger. +# load a file into the debugger (file command only). # return a -1 if anything goes wrong. # -proc mi_gdb_load { arg } { +proc mi_gdb_file_cmd { arg } { global verbose global loadpath global loadfile @@ -300,16 +300,21 @@ proc mi_gdb_load { arg } { =20 set last_mi_gdb_file $arg; =20 - # ``gdb_unload'' + if [is_remote host] { + set arg [remote_download host $arg]; + if { $arg =3D=3D "" } { + error "download failed" + return -1; + } + } =20 - # ``gdb_file_cmd'' # FIXME: Several of these patterns are only acceptable for console # output. Queries are an error for mi. send_gdb "105-file-exec-and-symbols $arg\n" gdb_expect 120 { -re "Reading symbols from.*done.*$mi_gdb_prompt$" { verbose "\t\tLoaded $arg into the $GDB" - # All OK + return 0 } -re "has no symbol-table.*$mi_gdb_prompt$" { perror "$arg wasn't compiled with \"-g\"" @@ -338,14 +343,15 @@ proc mi_gdb_load { arg } { return -1 } -re "105-file-exec-and-symbols .*\r\n105\\\^done\r\n$mi_gdb_prompt= $" { - # We are just giving the prompt back for now - # All OK - } + # We (MI) are just giving the prompt back for now, instead of = giving + # some acknowledgement. + return 0 + } timeout { perror "couldn't load $arg into $GDB (timed out)." return -1 } - eof { + eof { # This is an attempt to detect a core dump, but seems not to # work. Perhaps we need to match .* followed by eof, in which # gdb_expect does not seem to have a way to do that. @@ -353,7 +359,24 @@ proc mi_gdb_load { arg } { return -1 } } -=20=20=20=20 +} + +# +# load a file into the debugger. +# return a -1 if anything goes wrong. +# +proc mi_gdb_load { arg } { + global verbose + global loadpath + global loadfile + global GDB + global mi_gdb_prompt + upvar timeout timeout + + # ``gdb_unload'' + + mi_gdb_file_cmd $arg + # ``load'' if { [info procs send_target_sid] !=3D "" } { # For SID, things get complex