This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA: mi testsuite] Gdbserver support for the MI testsuite
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: gdb-patches at sources dot redhat dot com, cagney at redhat dot com, ezannoni at redhat dot com
- Date: Sun, 17 Aug 2003 16:57:13 -0400
- Subject: Re: [RFA: mi testsuite] Gdbserver support for the MI testsuite
- References: <20030622042226.GA25362@nevyn.them.org>
On Sun, Jun 22, 2003 at 12:22:26AM -0400, Daniel Jacobowitz wrote:
> 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?
[Am I talking to myself? Is there anybody out there?]
Would one of our MI testsuite maintainers kindly comment on this patch?
> 2003-06-22 Daniel Jacobowitz <drow@mvista.com>
>
> * 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
>
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer