(gdb_load): Delete, replace with...
(gdb_reload): ...this.
* gdb.server/server-run.exp: Use gdb_load and gdbserver_run.
* gdb.server/server-mon.exp: Likewise.
* lib/gdb.exp (gdb_run_cmd): Use gdb_reload.
(gdb_start_cmd): New.
(gdb_file_cmd): Save the last loaded file.
(gdb_reload): New.
(gdb_gnu_strip_debug): Use transform.
* lib/gdbserver-support.exp (gdbserver_spawn): Move file download
support here. Use new $last_loaded_file. Check mtime.
(gdb_target_cmd): Handle ObjC failure case.
(infer_host_exec): Delete.
(gdbserver_load): Rename to...
(gdbserver_run): ...this. Simplify.
* lib/mi-support.exp (mi_gdb_file_cmd): Set last_loaded_file.
(mi_gdb_load): Move most contents to a new function...
(mi_gdb_target_load): ...here. Simplify call to gdbserver_gdb_load.
(mi_run_cmd): Use mi_gdb_target_load.
* gdb.base/break.exp, gdb.base/ending-run.exp, gdb.base/pending.exp,
gdb.base/sepdebug.exp, gdb.base/unload.exp, gdb.objc/objcdecode.exp:
Use gdb_run_cmd.
* gdb.base/charsign.exp: Remove incorrect comment.
* gdb.base/dbx.exp (gdb_file_cmd): Set last_loaded_file.
* gdb.ada/exec_changed.exp, gdb.ada/null_record.exp, gdb.ada/start.exp,
gdb.base/start.exp: Use gdb_start_cmd.
+2007-03-27 Daniel Jacobowitz <dan@codesourcery.com>
+
+ * config/gdbserver.exp (gdbserver_gdb_load): Update argument list.
+ (gdb_load): Delete, replace with...
+ (gdb_reload): ...this.
+ * gdb.server/server-run.exp: Use gdb_load and gdbserver_run.
+ * gdb.server/server-mon.exp: Likewise.
+ * lib/gdb.exp (gdb_run_cmd): Use gdb_reload.
+ (gdb_start_cmd): New.
+ (gdb_file_cmd): Save the last loaded file.
+ (gdb_reload): New.
+ (gdb_gnu_strip_debug): Use transform.
+ * lib/gdbserver-support.exp (gdbserver_spawn): Move file download
+ support here. Use new $last_loaded_file. Check mtime.
+ (gdb_target_cmd): Handle ObjC failure case.
+ (infer_host_exec): Delete.
+ (gdbserver_load): Rename to...
+ (gdbserver_run): ...this. Simplify.
+ * lib/mi-support.exp (mi_gdb_file_cmd): Set last_loaded_file.
+ (mi_gdb_load): Move most contents to a new function...
+ (mi_gdb_target_load): ...here. Simplify call to gdbserver_gdb_load.
+ (mi_run_cmd): Use mi_gdb_target_load.
+ * gdb.base/break.exp, gdb.base/ending-run.exp, gdb.base/pending.exp,
+ gdb.base/sepdebug.exp, gdb.base/unload.exp, gdb.objc/objcdecode.exp:
+ Use gdb_run_cmd.
+ * gdb.base/charsign.exp: Remove incorrect comment.
+ * gdb.base/dbx.exp (gdb_file_cmd): Set last_loaded_file.
+ * gdb.ada/exec_changed.exp, gdb.ada/null_record.exp, gdb.ada/start.exp,
+ gdb.base/start.exp: Use gdb_start_cmd.
+
2007-03-23 Nigel Stephens <nigel@mips.com>
Maciej W. Rozycki <macro@mips.com>
load_lib gdbserver-support.exp
-proc gdbserver_gdb_load { arg } {
- return [gdbserver_spawn $arg ""]
+proc gdbserver_gdb_load { } {
+ return [gdbserver_spawn ""]
}
-proc gdb_load { arg } {
- return [gdbserver_load $arg ""]
+proc gdb_reload { } {
+ return [gdbserver_run ""]
}
gdb_load ${binfile}
# Start the program, we should land in the program main procedure
-gdb_test "start" \
+if { [gdb_start_cmd] < 0 } {
+ untested start
+ return -1
+}
+
+gdb_test "" \
"first \\(\\) at .*first.adb.*" \
"start first"
# Start the program a second time, GDB should land in procedure Second
# this time.
-if [is_remote target] {
- unsupported "start the program a second time ";
+if { [gdb_start_cmd] < 0 } {
+ fail "start second"
} else {
- # Start the program, we should land in the program main procedure
- gdb_test "start" \
+ gdb_test "" \
"second \\(\\) at .*second.adb.*" \
"start second"
}
-
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
-gdb_test "start" \
+if { [gdb_start_cmd] < 0 } {
+ untested start
+ return -1
+}
+
+gdb_test "" \
"null_record \\(\\) at .*null_record.adb.*" \
"start"
gdb_load ${binfile}
# Verify that "start" lands inside the right procedure.
-gdb_test "start" \
+if { [gdb_start_cmd] < 0 } {
+ untested start
+ return -1
+}
+
+gdb_test "" \
"dummy \\(\\) at .*dummy.adb.*" \
"start"
-
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
-if ![target_info exists use_gdb_stub] {
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"2\"\n"
- set timeout 120
- verbose "Timeout is now $timeout seconds" 2
- } else {
- send_gdb "run\n"
- }
- gdb_expect {
- -re "The program .* has been started already.*y or n. $" {
- send_gdb "y\n"
- exp_continue
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
+ pass "run until function breakpoint"
}
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\
- { pass "run until function breakpoint" }
- -re ".*$gdb_prompt $" { fail "run until function breakpoint" }
- timeout { fail "run until function breakpoint (timeout)" }
- }
-} else {
- if ![target_info exists gdb_stub] {
- gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue"
+ -re "$gdb_prompt $" {
+ fail "run until function breakpoint"
+ }
+ timeout {
+ fail "run until function breakpoint (timeout)"
}
}
global decimal
global binfile
- if [target_info exists use_gdb_stub] {
- # Reload the program.
- delete_breakpoints
- gdb_load ${binfile};
- } else {
- # FIXME: should be using runto
- gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
-
- delete_breakpoints
- }
+ gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
+ delete_breakpoints
gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial"
# Run until we call factorial with 6
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"6\"\n"
- } else {
- gdb_run_cmd
- }
+ gdb_run_cmd
gdb_expect {
-re "Break.* factorial .value=6. .*$gdb_prompt $" {}
-re ".*$gdb_prompt $" {
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
-if ![target_info exists use_gdb_stub] {
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"2\"\n"
- set timeout 120
- verbose "Timeout is now $timeout seconds" 2
- } else {
- send_gdb "run\n"
- }
- gdb_expect {
- -re "The program .* has been started already.*y or n. $" {
- send_gdb "y\n"
- exp_continue
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
+ pass "run until function breakpoint, optimized file"
}
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\
- { pass "run until function breakpoint, optimized file" }
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $"\
- { pass "run until function breakpoint, optimized file (code motion)" }
- -re ".*$gdb_prompt $" { fail "run until function breakpoint, optimized file" }
- timeout { fail "run until function breakpoint, optimized file (timeout)" }
- }
-} else {
- if ![target_info exists gdb_stub] {
- gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue, optimized file"
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" {
+ pass "run until function breakpoint, optimized file (code motion)"
+ }
+ -re "$gdb_prompt $" {
+ fail "run until function breakpoint, optimized file"
+ }
+ timeout {
+ fail "run until function breakpoint, optimized file (timeout)"
}
}
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
- # For C programs, "start" should stop in main().
-
gdb_test "p n" \
"= \"A\""
gdb_test "p s" \
global gdb_prompt
global spawn_id
upvar timeout timeout
+ global last_loaded_file
+
+ set last_loaded_file $arg
if [is_remote host] {
set arg [remote_download host $arg];
# Expect to hit the bp at line "1", but symbolize this
# as line "13". Then try to clear it--this should work.
#
-if [target_info exists use_gdb_stub] {
- gdb_test "continue" ".*Breakpoint.*1.*callee.*13.*"
-} else {
- gdb_test "r" ".*Breakpoint.*1.*callee.*13.*"
-}
+gdb_run_cmd
+gdb_test "" ".*Breakpoint.*1.*callee.*13.*" "run"
+
gdb_test "cle" ".*Deleted breakpoints 2 1.*" "clear worked"
send_gdb "i b\n"
gdb_expect {
# Run to main which should resolve a pending breakpoint
#
-gdb_test "run" \
+gdb_run_cmd
+gdb_test "" \
"Breakpoint.*at.*
Pending breakpoint \"pendshr.c:26 if x > 3\" resolved.*
Breakpoint.*, main.*$mainline.*" \
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
-if ![target_info exists use_gdb_stub] {
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"2\"\n"
- set timeout 120
- verbose "Timeout is now $timeout seconds" 2
- } else {
- send_gdb "run\n"
- }
- gdb_expect {
- -re "The program .* has been started already.*y or n. $" {
- send_gdb "y\n"
- exp_continue
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
+ pass "run until function breakpoint"
}
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\
- { pass "run until function breakpoint" }
- -re ".*$gdb_prompt $" { fail "run until function breakpoint" }
- timeout { fail "run until function breakpoint (timeout)" }
- }
-} else {
- if ![target_info exists gdb_stub] {
- gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue"
+ -re "$gdb_prompt $" {
+ fail "run until function breakpoint"
+ }
+ timeout {
+ fail "run until function breakpoint (timeout)"
}
}
global decimal
global binfile
- if [target_info exists use_gdb_stub] {
- # Reload the program.
- delete_breakpoints
- gdb_load ${binfile};
- } else {
- # FIXME: should be using runto
- gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
-
- delete_breakpoints
- }
+ gdb_test "kill" "" "kill program" "Kill the program being debugged.*y or n. $" "y"
+ delete_breakpoints
gdb_test "break factorial" "Breakpoint $decimal at .*" "break at factorial"
# Run until we call factorial with 6
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"6\"\n"
- } else {
- gdb_run_cmd
- }
+ gdb_run_cmd
gdb_expect {
-re "Break.* factorial .value=6. .*$gdb_prompt $" {}
-re ".*$gdb_prompt $" {
#
# run until the breakpoint at main is hit. For non-stubs-using targets.
#
-if ![target_info exists use_gdb_stub] {
- if [istarget "*-*-vxworks*"] then {
- send_gdb "run vxmain \"2\"\n"
- set timeout 120
- verbose "Timeout is now $timeout seconds" 2
- } else {
- send_gdb "run\n"
- }
- gdb_expect {
- -re "The program .* has been started already.*y or n. $" {
- send_gdb "y\n"
- exp_continue
+gdb_run_cmd
+gdb_expect {
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" {
+ pass "run until function breakpoint, optimized file"
}
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $"\
- { pass "run until function breakpoint, optimized file" }
- -re "Starting program.*Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $"\
- { pass "run until function breakpoint, optimized file (code motion)" }
- -re ".*$gdb_prompt $" { fail "run until function breakpoint, optimized file" }
- timeout { fail "run until function breakpoint, optimized file (timeout)" }
- }
-} else {
- if ![target_info exists gdb_stub] {
- gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.*\{.*" "stub continue, optimized file"
+ -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$gdb_prompt $" {
+ pass "run until function breakpoint, optimized file (code motion)"
+ }
+ -re "$gdb_prompt $" {
+ fail "run until function breakpoint, optimized file"
+ }
+ timeout {
+ fail "run until function breakpoint, optimized file (timeout)"
}
}
gdb_load ${binfile}
# For C programs, "start" should stop in main().
+if { [gdb_start_cmd] < 0 } {
+ untested start
+ return -1
+}
-gdb_test "start" \
+gdb_test "" \
"main \\(\\) at .*start.c.*" \
"start"
set unloadshr_line [gdb_get_line_number "unloadshr break" ${libsrcfile}]
-gdb_test "run" \
-"Starting program.*unload.*
-Breakpoint.*at.*
+gdb_run_cmd
+gdb_test "" \
+"Breakpoint.*at.*
Pending breakpoint \"shrfunc1\" resolved.*
Breakpoint.*, shrfunc1 \\\(x=3\\\).*unloadshr.c:$unloadshr_line.*" \
"running program"
gdb_test "continue" \
-"Continuing.*y is 7.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \
+"Continuing.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \
"continuing to end of program"
#
# Try to rerun program and verify that shared breakpoint is reset properly
#
-gdb_test "run" \
+gdb_run_cmd
+gdb_test "" \
".*Breakpoint.*shrfunc1.*at.*unloadshr.c:$unloadshr_line.*" \
"rerun to shared library breakpoint"
gdb_test "continue" \
-"Continuing.*y is 7.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \
+"Continuing.*warning: Temporarily disabling breakpoints for.*unloadshr.sl.*Program exited normally." \
"continuing to end of program second time"
}
set name "continue after break on multiply defined symbol"
-gdb_test_multiple "run" $name \
+gdb_run_cmd
+gdb_test_multiple "" $name \
{
- -re "Starting program.*Breakpoint \[0-9\]+, multipleDef \\\(\\\) at .*\r\n$gdb_prompt $" {
+ -re "Breakpoint \[0-9\]+, multipleDef \\\(\\\) at .*\r\n$gdb_prompt $" {
pass $name
}
- -re "Starting program.*\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" {
+ -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] -.Decode multipleDef. at .*\r\n\\\[3\\\] multipleDef at .*\r\n> $" {
send_gdb "0\n"
kfail "gdb/1238" $name
# gdb is in a bad state here.
gdb_exit
gdb_start
-
-gdbserver_load $binfile ""
+gdb_load $binfile
gdb_reinitialize_dir $srcdir/$subdir
+gdbserver_run ""
+
gdb_test_multiple "monitor help" "" {
-re "Unknown monitor command.*$gdb_prompt $" {
fail "monitor help"
gdb_exit
gdb_start
+gdb_load $binfile
-gdbserver_load $binfile ""
+gdbserver_run ""
gdb_reinitialize_dir $srcdir/$subdir
gdb_breakpoint main
if [target_info exists use_gdb_stub] {
if [target_info exists gdb,do_reload_on_run] {
- # Specifying no file, defaults to the executable
- # currently being debugged.
- if { [gdb_load ""] != 0 } {
+ if { [gdb_reload] != 0 } {
return;
}
send_gdb "continue\n";
send_gdb "y\n"
}
-re "The program is not being run.*$gdb_prompt $" {
- if { [gdb_load ""] != 0 } {
+ if { [gdb_reload] != 0 } {
return;
}
send_gdb "jump *$start\n";
}
if [target_info exists gdb,do_reload_on_run] {
- if { [gdb_load ""] != 0 } {
+ if { [gdb_reload] != 0 } {
return;
}
}
}
}
+# Generic start command. Return 0 if we could start the program, -1
+# if we could not.
+
+proc gdb_start_cmd {args} {
+ global gdb_prompt
+
+ if [target_info exists gdb_init_command] {
+ send_gdb "[target_info gdb_init_command]\n";
+ gdb_expect 30 {
+ -re "$gdb_prompt $" { }
+ default {
+ perror "gdb_init_command for target failed";
+ return;
+ }
+ }
+ }
+
+ if [target_info exists use_gdb_stub] {
+ return -1
+ }
+
+ send_gdb "start $args\n"
+ gdb_expect 60 {
+ -re "The program .* has been started already.*y or n. $" {
+ send_gdb "y\n"
+ exp_continue
+ }
+ # Use -notransfer here so that test cases (like chng-sym.exp)
+ # may test for additional start-up messages.
+ -notransfer -re "Starting program: \[^\r\n\]*" {
+ return 0
+ }
+ }
+ return -1
+}
+
# Set a breakpoint at FUNCTION. If there is an additional argument it is
# a list of options; the only currently supported option is allow-pending.
global gdb_prompt
global verbose
global GDB
+ global last_loaded_file
+
+ set last_loaded_file $arg
# Set whether debug info was found.
# Default to "fail".
return [gdb_file_cmd $arg]
}
+# gdb_reload -- load a file into the target. Called before "running",
+# either the first time or after already starting the program once,
+# for remote targets. Most files that override gdb_load should now
+# override this instead.
+
+proc gdb_reload { } {
+ # For the benefit of existing configurations, default to gdb_load.
+ # Specifying no file defaults to the executable currently being
+ # debugged.
+ return [gdb_load ""]
+}
+
proc gdb_continue { function } {
global decimal
gdb_exit
set debug_file [separate_debug_filename $dest]
- set strip_to_file_program strip
- set objcopy_program objcopy
+ set strip_to_file_program [transform strip]
+ set objcopy_program [transform objcopy]
# Make sure the directory that will hold the separated debug
# info actually exists.
-re "Timeout reading from remote system.*$gdb_prompt $" {
verbose "Got timeout error from gdb."
}
+ -notransfer -re "Remote debugging using .*\r\n> $" {
+ # We got an unexpected prompt while creating the target.
+ # Leave it there for the test to diagnose.
+ return 1
+ }
timeout {
send_gdb "\ 3"
break
#
# Returns the target protocol and socket to connect to.
-proc gdbserver_spawn { server_exec child_args } {
+proc gdbserver_spawn { child_args } {
global portnum
+ global gdbserver_host_exec
+ global gdbserver_host_mtime
+ global gdbserver_server_exec
+ global last_loaded_file
+
+ set host_exec $last_loaded_file
+
+ # If we already downloaded a file to the target, see if we can reuse it.
+ set reuse 0
+ if { [info exists gdbserver_server_exec] } {
+ set reuse 1
+
+ # If the file has changed, we can not.
+ if { $host_exec != $gdbserver_host_exec } {
+ set reuse 0
+ }
+
+ # If the mtime has changed, we can not.
+ if { [file mtime $host_exec] != $gdbserver_host_mtime } {
+ set reuse 0
+ }
+ }
+
+ if { $reuse == 0 } {
+ set gdbserver_host_exec $host_exec
+ set gdbserver_host_mtime [file mtime $host_exec]
+ if [is_remote target] {
+ set gdbserver_server_exec [remote_download target $host_exec /tmp/[file tail $host_exec].[pid]]
+ } else {
+ set gdbserver_server_exec $host_exec
+ }
+ }
# Port id -- either specified in baseboard file, or managed here.
if [target_info exists gdb,socketport] {
# Fire off the debug agent. This flavour of gdbserver takes as
# arguments the port information, the name of the executable file to
# be debugged, and any arguments.
- set gdbserver_command "$gdbserver :$portnum $server_exec"
+ set gdbserver_command "$gdbserver :$portnum $gdbserver_server_exec"
if { $child_args != "" } {
append gdbserver_command " $child_args"
}
return [list $protocol $gdbport]
}
-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 $host_exec
-}
-
# Start a gdbserver process running HOST_EXEC and pass CHILD_ARGS
# to it. Return 0 on success, or non-zero on failure.
-proc gdbserver_load { host_exec child_args } {
- global gdbserver_host_exec
- global gdbserver_server_exec
-
- # If we weren't passed an explicit binary, try to reuse the current
- # one. If we were, be sure to redownload it.
-
- if { $host_exec == "" && $gdbserver_host_exec == "" } {
- set gdbserver_host_exec [infer_host_exec]
- } elseif { $host_exec != "" } {
- set gdbserver_host_exec $host_exec
- if [info exists gdbserver_server_exec] { unset gdbserver_server_exec }
- }
-
- if { ! [info exists gdbserver_server_exec] } {
- if [is_remote target] {
- set gdbserver_server_exec [remote_download target $host_exec /tmp/[file tail $gdbserver_host_exec].[pid]]
- } else {
- set gdbserver_server_exec $gdbserver_host_exec
- }
- }
-
- set res [gdbserver_spawn $gdbserver_server_exec $child_args]
+proc gdbserver_run { child_args } {
+ set res [gdbserver_spawn $child_args]
set protocol [lindex $res 0]
set gdbport [lindex $res 1]
- if { $host_exec != "" } {
- if [gdb_file_cmd $host_exec] {
- return -1
- }
- }
- gdb_target_cmd $protocol $gdbport
+ return [gdb_target_cmd $protocol $gdbport]
}
global loadfile
global GDB
global mi_gdb_prompt
- global last_mi_gdb_file
- global last_mi_remote_file
+ global last_loaded_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_loaded_file $arg
if [is_remote host] {
set arg [remote_download host $arg];
}
#
-# load a file into the debugger.
+# connect to the target and download a file, if necessary.
# return a -1 if anything goes wrong.
#
-proc mi_gdb_load { arg } {
+proc mi_gdb_target_load { } {
global verbose
global loadpath
global loadfile
global mi_gdb_prompt
upvar timeout timeout
- # ``gdb_unload''
- if { $arg != "" } {
- mi_gdb_file_cmd $arg
- }
-
- # ``load''
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 /tmp/[file tail $arg].[pid]]
- } else {
- set last_mi_remote_file $last_mi_gdb_file
- }
- }
-
- set res [gdbserver_gdb_load $last_mi_remote_file]
+ set res [gdbserver_gdb_load]
set protocol [lindex $res 0]
set gdbport [lindex $res 1]
return 0
}
+#
+# load a file into the debugger.
+# return a -1 if anything goes wrong.
+#
+proc mi_gdb_load { arg } {
+ if { $arg != "" } {
+ return [mi_gdb_file_cmd $arg]
+ }
+ return 0
+}
+
# mi_gdb_test COMMAND PATTERN MESSAGE [IPATTERN] -- send a command to gdb;
# test the result.
#
}
}
+ if { [mi_gdb_target_load] < 0 } {
+ return
+ }
+
if [target_info exists use_gdb_stub] {
if [target_info exists gdb,do_reload_on_run] {
- # Specifying no file, defaults to the executable
- # currently being debugged.
- if { [mi_gdb_load ""] < 0 } {
- return;
- }
send_gdb "000-exec-continue\n";
gdb_expect 60 {
-re "000\\^running\[\r\n\]+$mi_gdb_prompt$" {}