This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]