From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3820 invoked by alias); 18 Jan 2004 15:23:50 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 3804 invoked from network); 18 Jan 2004 15:23:48 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 18 Jan 2004 15:23:48 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1AiEmB-0005vZ-RA for ; Sun, 18 Jan 2004 10:23:47 -0500 Date: Sun, 18 Jan 2004 15:23:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Subject: Re: [RFA: mi testsuite] Gdbserver support for the MI testsuite Message-ID: <20040118152347.GB2356@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com References: <20030622042226.GA25362@nevyn.them.org> <16220.56898.314626.120093@localhost.redhat.com> <20031124041957.GA7603@nevyn.them.org> <16334.29304.223622.767814@localhost.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <16334.29304.223622.767814@localhost.redhat.com> User-Agent: Mutt/1.5.1i X-SW-Source: 2004-01/txt/msg00473.txt.bz2 On Wed, Dec 03, 2003 at 06:32:08PM -0500, Elena Zannoni wrote: > Daniel Jacobowitz writes: > > OK? > >=20 > > --=20 > > Daniel Jacobowitz > > MontaVista Software Debian GNU/Linux Developer > >=20 > > 2003-06-22 Daniel Jacobowitz > >=20 > > * 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. > > (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. > >=20 >=20 > Ok, but one more thing. see below > > +# FIXME: Should use -target-select. >=20 > please use -target-select. mi_gdb_load already uses it.=20 OK. I forgot to take care of this last year; copyright dates updated, -target-select added, retested, and committed the below. Thanks! --=20 Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-01-18 Daniel Jacobowitz * 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. Index: config/gdbserver.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/config/gdbserver.exp,v retrieving revision 1.5 diff -u -p -r1.5 gdbserver.exp --- config/gdbserver.exp 19 Jul 2002 19:40:28 -0000 1.5 +++ config/gdbserver.exp 18 Jan 2004 03:51:21 -0000 @@ -2,7 +2,7 @@ # ie. a debug agent running as a native process on the same or # a different host. =20 -# Copyright 2000, 2002 Free Software Foundation, Inc. +# Copyright 2000, 2002, 2003, 2004 Free Software Foundation, Inc. =20 # 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"; =20 -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 =20 # 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; =20 - # Remember new exec file. - if { $arg =3D=3D "" } { - 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"] - }=20 + } =20 - # 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 . { } + } + + # We can't just call close, because if gdbserver is local then that me= ans + # 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) + } + } =20 - # Give it a little time to establish - sleep 1 + return [list $protocol $gdbport]; +} =20 - # tell gdb what file we are debugging - if { $arg !=3D "" } { - if [gdb_file_cmd $arg] { - return -1; +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 $" { } } =20 - # attach to the "serial port" - gdb_target_cmd $protocol $gdbport; + return $host_exec +} =20 - # 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 gdb_load { arg } { + global host_exec + global server_exec + + if { $arg =3D=3D "" && $host_exec =3D=3D "" } { + set host_exec [infer_host_exec] + } elseif { $arg !=3D "" } { + set host_exec $arg + if [info exists server_exec] { unset server_exec } } =20 - return 0; + 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 !=3D "" } { + if [gdb_file_cmd $arg] { + return -1 + } + } + gdb_target_cmd $protocol $gdbport } Index: lib/mi-support.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/lib/mi-support.exp,v retrieving revision 1.23 diff -u -p -r1.23 mi-support.exp --- lib/mi-support.exp 22 Jun 2003 00:04:27 -0000 1.23 +++ lib/mi-support.exp 18 Jan 2004 03:51:21 -0000 @@ -1,4 +1,4 @@ -# Copyright 1999, 2000, 2002 Free Software Foundation, Inc. +# Copyright 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. =20 # 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 }=20 } } =20 +# 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 <=3D 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$" {=20 + 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 "=03"; + 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 =20 if { $arg =3D=3D "" } { 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 + } } =20 - set last_mi_gdb_file $arg; - - # ``gdb_unload'' + if [is_remote host] { + set arg [remote_download host $arg]; + if { $arg =3D=3D "" } { + error "download failed" + return -1; + } + } =20 - # ``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 } } -=20=20=20=20 +} + +# +# 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 !=3D "" } { + mi_gdb_file_cmd $arg + } + # ``load'' - if { [info procs send_target_sid] !=3D "" } { + if { [info procs gdbserver_gdb_load] !=3D "" } { + 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] !=3D 0 } { + return -1 + } + } elseif { [info procs send_target_sid] !=3D "" } { # For SID, things get complex send_target_sid gdb_expect 60 {