From c79f61db34bcaaec6538703730d43b280762dc39 Mon Sep 17 00:00:00 2001 From: Rob Savoye Date: Mon, 30 Aug 1993 23:08:02 +0000 Subject: [PATCH] Make gdb_exit into default_gdb_exit so it can be shared. --- gdb/testsuite/lib/gdb.exp | 87 +++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 12 deletions(-) diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index a8ba0eeee8c..880ff0f8d6c 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -15,7 +15,7 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ # Please email any bugs, comments, and/or additions to this file to: -# DejaGnu@cygnus.com +# bug-gdb@prep.ai.mit.edu # This file was written by Fred Fish. (fnf@cygnus.com) @@ -49,7 +49,7 @@ proc gdb_unload {} { -re "$prompt $" {} timeout { error "couldn't unload file in $GDB (timed out)." - alldone + return -1 } } } @@ -108,19 +108,26 @@ proc runto { function } { } send "break $function\n" + # The first regexp is what we get with -g, the second without -g. expect { -re "Break.* at .*: file .*, line $decimal.\r\n$prompt $" {} + -re "Breakpoint \[0-9\]* at 0x\[0-9a-f\]*.*$prompt $" {} -re "$prompt $" { fail "setting breakpoint at $function" ; return 0 } timeout { fail "setting breakpoint at $function (timeout)" ; return 0 } } send "run\n" + # the "at foo.c:36" output we get with -g. + # the "in func" output we get without -g. expect { -re "The program .* has been started already.* \(y or n\) $" { send "y\n" continue -expect } - -re "Starting.*Break.*\(\) at .*:$decimal.*$prompt $" { return 1 } + -re "Starting.*Break.* at .*:$decimal.*$prompt $" { return 1 } + -re "Breakpoint \[0-9\]*, \[0-9xa-f\]* in $function.*$prompt $" { + return 1 + } -re "$prompt $" { fail "running to $function" ; return 0 } timeout { fail "running to $function (timeout)" ; return 0 } } @@ -163,8 +170,10 @@ proc gdb_test { args } { set errmess "" # trap the send so any problems don't crash things catch "send \"$command\n\"" errmess - if ![string match "" $errmess] then { - error "send \"$command\" got expect error \"$errmess\"" + if [string match "write\(spawn_id=\[0-9\]+\):" $errmess] then { + error "sent \"$command\" got expect error \"$errmess\"" + catch "close" + gdb_start return -1 } @@ -185,9 +194,11 @@ proc gdb_test { args } { } -re "Undefined command:.*$prompt" { error "Undefined command \"$command\"." + set result 1 } -re "Ambiguous command.*$prompt $" { error "\"$command\" is not a unique command name." + set result 1 } -re ".*$prompt $" { if ![string match "" $message] then { @@ -203,12 +214,13 @@ proc gdb_test { args } { send "n\n" error "Got interactive prompt." } + eof { + error "Process no longer exists" + return -1 + } buffer_full { error "internal buffer is full." } - eof { - error "eof -- pty is hosed." - } timeout { fail "(timeout) $message" set result 1 @@ -217,10 +229,6 @@ proc gdb_test { args } { return $result } -# "virtual memory exhausted" { -# error "virtual memory exhausted." -# } - proc gdb_reinitialize_dir { subdir } { global prompt global verbose @@ -253,3 +261,58 @@ proc gdb_reinitialize_dir { subdir } { } } } + + +# +# gdb_exit -- exit the GDB, killing the target program if necessary +# +proc default_gdb_exit {} { + global GDB + global GDBFLAGS + global verbose + + verbose "Quitting $GDB $GDBFLAGS" 1 + + # This used to be 1 for unix-gdb.exp + set timeout 5 + + catch "send \"quit\n\"" result + # If the process has gone away (e.g. gdb dumped core), deal with it. + if [string match "write\(spawn_id=\[0-9\]+\):" $result] then { + catch "close" + # FIXME: Shouldn't we call "wait" too? + return -1 + } + # FIXME: What is this catch statement doing here? Won't it prevent us + # from getting errors that we'd rather see? + catch { + expect { + eof { + verbose "Got EOF from $GDB" 2 + } + timeout { + verbose "Got TIMEOUT from $GDB" 2 + } + -re "The program is running. Quit anyway.*(y or n) $" { + send "y\n" + verbose "Killing program being debugged" 2 + } + } + } + + # FIXME: Does the catch prevent us from getting errors that we'd rather + # see? the old gdb_exit in unix-gdb.exp had "close" without catch + # in the above expect statement (for the timeout and -re "The + # program... cases) (as well as a catch "close" here). + catch "close" + + # Before this was here sometimes "uit" would get sent to the next GDB + # (assuming this is immediately followed by gdb_start), which would + # cause a loss of syncronization (i.e. all the stuff that swallows a + # prompt would swallow the wrong one). + wait +} + + + + -- 2.30.2