From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14944 invoked by alias); 8 Sep 2003 19:45:02 -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 14886 invoked from network); 8 Sep 2003 19:45:00 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 8 Sep 2003 19:45:00 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h88Jitl31783 for ; Mon, 8 Sep 2003 15:44:55 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h88Jiss05608 for ; Mon, 8 Sep 2003 15:44:54 -0400 Received: from localhost.redhat.com (porkchop.devel.redhat.com [172.16.58.2]) by pobox.corp.redhat.com (8.12.8/8.12.8) with ESMTP id h88JisXS032232 for ; Mon, 8 Sep 2003 15:44:54 -0400 Received: by localhost.redhat.com (Postfix, from userid 469) id EA0C22CB2D; Mon, 8 Sep 2003 15:53:38 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16220.56898.314626.120093@localhost.redhat.com> Date: Mon, 08 Sep 2003 19:45:00 -0000 To: Daniel Jacobowitz Cc: gdb-patches@sources.redhat.com Subject: Re: [RFA: mi testsuite] Gdbserver support for the MI testsuite In-Reply-To: <20030622042226.GA25362@nevyn.them.org> References: <20030622042226.GA25362@nevyn.them.org> X-SW-Source: 2003-09/txt/msg00128.txt.bz2 Daniel Jacobowitz writes: > 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? > I still have the same objection I had back then. I'd like to see the mi_* functions be moved to mi-support.exp. see: http://sources.redhat.com/ml/gdb-patches/2002-07/msg00227.html I'd still like to have mi-support.exp be loaded only when the mi tests are being done. The flo is like this: an mi test file calls mi_gdb_load (indirectly, via mi_run_to_main), which in turn decides what different mechanism to use depenging on the target. This stuff you are adding is just another kind of target that should be handled from the same central core place. If you really are that desperate to keep the mi_ versions in gdbserver.exp and monitor.exp, could those be called from mi-support.exp at least, so that the path of execution is consistent with the rest? elena > -- > 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 > =================================================================== > 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"; > > -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; > > # 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 == "" } { > 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 == 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> /dev/null}"] > } > > # We can't call close, because if gdbserver is local then that means > @@ -187,40 +204,72 @@ proc gdb_load { arg } { > > # tell gdb what file we are debugging > if { $arg != "" } { > - if [gdb_file_cmd $arg] { > - return -1; > + if { $mi == 0 } { > + if [gdb_file_cmd $arg] { > + return -1; > + } > + } else { > + if [mi_gdb_file_cmd $arg] { > + return -1; > + } > } > } > > # attach to the "serial port" > - gdb_target_cmd $protocol $gdbport; > + if { $mi == 0 } { > + gdb_target_cmd $protocol $gdbport > + } else { > + mi_gdb_target_cmd $protocol $gdbport > + } > > # 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 == 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." > + } > + } > + } > + } > } > > 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 > =================================================================== > 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 > } > > > +# Much the same, but for MI. > +proc mi_gdb_target_cmd { targetname serialport } { > + global mi_gdb_prompt > + > + for {set i 1} {$i <= 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$" { > + 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 ""; > + break > + } > + } > + } > + return 1 > +} > + > + > > # > # gdb_target_monitor > Index: testsuite/lib/gdb.exp > =================================================================== > 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. > > load_lib libgloss.exp > +load_lib mi-support.exp > > global GDB > > Index: testsuite/lib/mi-support.exp > =================================================================== > 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 } > } > > # > -# 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 } { > > set last_mi_gdb_file $arg; > > - # ``gdb_unload'' > + if [is_remote host] { > + set arg [remote_download host $arg]; > + if { $arg == "" } { > + error "download failed" > + return -1; > + } > + } > > - # ``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 > } > } > - > +} > + > +# > +# 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] != "" } { > # For SID, things get complex