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]

Re: [RFA: mi testsuite] Gdbserver support for the MI testsuite


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  <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]