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


Ping?

On Sun, Aug 17, 2003 at 04:57:13PM -0400, Daniel Jacobowitz wrote:
> 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?

> 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


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