* config/gdbserver.exp (gdbserver_gdb_load): Rename from gdb_load.

Remove downloading, guessing the host executable, the calls to
	gdb_file_cmd and gdb_target_cmd, and "load" support.
	(infer_host_exec): New function broken out from gdb_load.
	(gdb_load): New wrapper for gdbserver_gdb_load.
	* lib/mi-support.exp (mi_gdb_target_cmd): New function, based on
	gdb_target_cmd.  Use -target-select.
	(mi_gdb_file_cmd): New function, broken out from mi_gdb_load.
	Download binaries to the host.  Clear last_mi_remote_file when
	we load a new binary.
	(mi_gdb_load): Call mi_gdb_file_cmd.  If gdbserver.exp is loaded,
	call gdbserver_gdb_load and mi_gdb_target_cmd.
This commit is contained in:
Daniel Jacobowitz 2004-01-18 15:23:30 +00:00
parent 4389ce38f0
commit da6012e52d
3 changed files with 194 additions and 90 deletions

View file

@ -1,3 +1,18 @@
2004-01-18 Daniel Jacobowitz <drow@mvista.com>
* config/gdbserver.exp (gdbserver_gdb_load): Rename from gdb_load.
Remove downloading, guessing the host executable, the calls to
gdb_file_cmd and gdb_target_cmd, and "load" support.
(infer_host_exec): New function broken out from gdb_load.
(gdb_load): New wrapper for gdbserver_gdb_load.
* lib/mi-support.exp (mi_gdb_target_cmd): New function, based on
gdb_target_cmd. Use -target-select.
(mi_gdb_file_cmd): New function, broken out from mi_gdb_load.
Download binaries to the host. Clear last_mi_remote_file when
we load a new binary.
(mi_gdb_load): Call mi_gdb_file_cmd. If gdbserver.exp is loaded,
call gdbserver_gdb_load and mi_gdb_target_cmd.
2004-01-17 Michael Chastain <mec.gnu@mindspring.com>
* gdb.cp/templates.exp: Accept more spaces with "<foo, ?bar>"

View file

@ -2,7 +2,7 @@
# ie. a debug agent running as a native process on the same or
# a different host.
# Copyright 2000, 2002 Free Software Foundation, Inc.
# Copyright 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -89,12 +89,8 @@ global server_exec;
global portnum;
set portnum "2345";
proc gdb_load { arg } {
global host_exec;
global server_exec;
global portnum;
global verbose;
global gdb_prompt;
proc gdbserver_gdb_load { server_exec } {
global portnum
# Port id -- either specified in baseboard file, or managed here.
if [target_info exists gdb,socketport] {
@ -134,35 +130,6 @@ proc gdb_load { arg } {
# Export the host:port pair.
set gdbport $debughost$portnum;
# Remember new exec file.
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;
}
-re "$gdb_prompt $" { }
}
}
} else {
set host_exec $arg
if [info exists server_exec] { unset server_exec }
}
if { ! [info exists server_exec] } {
if [is_remote target] {
set server_exec [remote_download target $host_exec]
} else {
set server_exec $host_exec
}
}
# Fire off the debug agent
if [target_info exists gdb_server_args] {
# This flavour of gdbserver takes as arguments those specified
@ -175,52 +142,77 @@ proc gdb_load { arg } {
# and the name of the executable file to be debugged.
set server_spawn_id [remote_spawn target \
"$gdbserver $sockethost$portnum $server_exec"]
}
}
# We can't call close, because if gdbserver is local then that means
# that it will get a SIGHUP.
## close -i $server_spawn_id
wait -nowait -i $server_spawn_id
# Wait for the server to produce at least one character of output.
expect {
-i $server_spawn_id
-notransfer
-re . { }
}
# Give it a little time to establish
sleep 1
# tell gdb what file we are debugging
if { $arg != "" } {
if [gdb_file_cmd $arg] {
return -1;
# We can't just call close, because if gdbserver is local then that means
# that it will get a SIGHUP. Doing it this way could also allow us to
# get at the inferior's input or output if necessary, and means that we
# don't need to redirect output.
expect_background {
-i $server_spawn_id
-re "." { }
eof {
# The spawn ID is already closed now (but not yet waited for).
wait -i $expect_out(spawn_id)
}
}
# attach to the "serial port"
gdb_target_cmd $protocol $gdbport;
return [list $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."
}
}
}
proc infer_host_exec { } {
set 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;
}
-re "$gdb_prompt $" { }
}
return 0;
return $host_exec
}
proc gdb_load { arg } {
global host_exec
global server_exec
if { $arg == "" && $host_exec == "" } {
set host_exec [infer_host_exec]
} elseif { $arg != "" } {
set host_exec $arg
if [info exists server_exec] { unset server_exec }
}
if { ! [info exists server_exec] } {
if [is_remote target] {
set server_exec [remote_download target $host_exec]
} else {
set server_exec $host_exec
}
}
set res [gdbserver_gdb_load $host_exec]
set protocol [lindex $res 0]
set gdbport [lindex $res 1]
if { $arg != "" } {
if [gdb_file_cmd $arg] {
return -1
}
}
gdb_target_cmd $protocol $gdbport
}

View file

@ -1,4 +1,4 @@
# Copyright 1999, 2000, 2002 Free Software Foundation, Inc.
# Copyright 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -281,35 +281,94 @@ proc mi_gdb_reinitialize_dir { subdir } {
}
}
# Send GDB the "target" command.
# FIXME: Some of these patterns are not appropriate for MI. Based on
# config/monitor.exp:gdb_target_command.
proc mi_gdb_target_cmd { targetname serialport } {
global mi_gdb_prompt
for {set i 1} {$i <= 3} {incr i} {
send_gdb "47-target-select $targetname $serialport\n"
gdb_expect 60 {
-re "47\\^connected.*$mi_gdb_prompt$" {
verbose "Set target to $targetname";
return 0;
}
-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 5
continue
}
-re "Timeout reading from remote system.*$mi_gdb_prompt$" {
verbose "Got timeout error from gdb.";
}
timeout {
send_gdb "";
break
}
}
}
return 1
}
#
# 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
global GDB
global mi_gdb_prompt
global last_mi_gdb_file
global last_mi_remote_file
upvar timeout timeout
if { $arg == "" } {
set arg $last_mi_gdb_file;
} else {
set last_mi_gdb_file $arg
if { [ info exists last_mi_remote_file ] } {
unset last_mi_remote_file
}
}
set last_mi_gdb_file $arg;
if [is_remote host] {
set arg [remote_download host $arg];
if { $arg == "" } {
error "download failed"
return -1;
}
}
# ``gdb_unload''
# ``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 +397,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,9 +413,46 @@ 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''
if { $arg != "" } {
mi_gdb_file_cmd $arg
}
# ``load''
if { [info procs send_target_sid] != "" } {
if { [info procs gdbserver_gdb_load] != "" } {
global last_mi_gdb_file
global last_mi_remote_file
if { ! [info exists last_mi_remote_file] } {
if [is_remote target] {
set last_mi_remote_file [remote_download target $arg]
} else {
set last_mi_remote_file $last_mi_gdb_file
}
}
set res [gdbserver_gdb_load $last_mi_remote_file]
set protocol [lindex $res 0]
set gdbport [lindex $res 1]
if { [mi_gdb_target_cmd $protocol $gdbport] != 0 } {
return -1
}
} elseif { [info procs send_target_sid] != "" } {
# For SID, things get complex
send_target_sid
gdb_expect 60 {