This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[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
- Date: Sun, 22 Jun 2003 00:22:26 -0400
- Subject: [RFA: mi testsuite] Gdbserver support for the MI testsuite
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?
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
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