From 756d8c7093fdf0f2134628c2f7514e8231ce4e82 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Mon, 19 Jul 2004 13:58:21 +0000 Subject: 2004-07-19 Andrew Cagney * gdb.base/selftest.exp: Copy file from here ... * gdb.gdb/selftest.exp: ... to here. --- gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.base/selftest.exp | 516 ------------------------------------ gdb/testsuite/gdb.gdb/selftest.exp | 516 ++++++++++++++++++++++++++++++++++++ 3 files changed, 521 insertions(+), 516 deletions(-) delete mode 100644 gdb/testsuite/gdb.base/selftest.exp create mode 100644 gdb/testsuite/gdb.gdb/selftest.exp (limited to 'gdb') diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b22e96e..f500bea 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-07-19 Andrew Cagney + + * gdb.base/selftest.exp: Copy file from here ... + * gdb.gdb/selftest.exp: ... to here. + 2004-07-16 Andrew Cagney * lib/insight-support.exp: Delete file. diff --git a/gdb/testsuite/gdb.base/selftest.exp b/gdb/testsuite/gdb.base/selftest.exp deleted file mode 100644 index 4196b74..0000000 --- a/gdb/testsuite/gdb.base/selftest.exp +++ /dev/null @@ -1,516 +0,0 @@ -# Copyright 1988, 1990, 1991, 1992, 1994, 1997, 1999, 2000, 2002, 2003 -# 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 -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# Please email any bugs, comments, and/or additions to this file to: -# bug-gdb@prep.ai.mit.edu - -# This file was written by Rob Savoye. (rob@cygnus.com) - -if $tracelevel then { - strace $tracelevel -} - -set prms_id 0 -set bug_id 0 - -# are we on a target board -if [is_remote target] { - return -} - -# Not all of the lines of code near the start of main are executed for -# every machine. Also, optimization may reorder some of the lines. -# So all we do is try to step or next over everything until we get -# to a line that we know is always executed. - -proc do_steps_and_nexts {} { - global gdb_prompt - global srcdir - - gdb_reinitialize_dir $srcdir/.. - - for {set count 0} {$count < 32} {incr count} { - send_gdb "list\n" - # NOTE: carlton/2002-12-11: The "initial brace" and - # "current_directory initialization" possibilities happen to - # me with GCC 3.1 on i686-pc-linux-gnu when I compile with - # optimization. - gdb_expect { - -re ".*context = data.*$gdb_prompt $" { - set description "step over context initialization" - set command "step" - } - -re ".*argc = context->argc.*$gdb_prompt $" { - set description "step over argc initialization" - set command "step" - } - -re ".*argv = context->argv.*$gdb_prompt $" { - set description "step over argv initialization" - set command "step" - } - -re ".*quiet = 0.*$gdb_prompt $" { - set description "step over quiet initialization" - set command "step" - } - -re ".*batch = 0.*$gdb_prompt $" { - set description "step over batch initialization" - set command "step" - } - -re ".*symarg = NULL.*$gdb_prompt $" { - set description "step over symarg initialization" - set command "step" - } - -re ".*execarg = NULL.*$gdb_prompt $" { - set description "step over execarg initialization" - set command "step" - } - -re ".*corearg = NULL.*$gdb_prompt $" { - set description "step over corearg initialization" - set command "step" - } - -re ".*cdarg = NULL.*$gdb_prompt $" { - set description "step over cdarg initialization" - set command "step" - } - -re ".*ttyarg = NULL.*$gdb_prompt $" { - set description "step over ttyarg initialization" - set command "step" - } - -re ".*time_at_startup = get_run_time.*$gdb_prompt $" { - set description "next over get_run_time and everything it calls" - set command "next" - } - -re ".*START_PROGRESS.*$gdb_prompt $" { - # Note: ezannoni/2004/02/17: This check should be - # removed, since as of today that source line is not - # in gdb anymore. - set description "next over START_PROGRESS and everything it calls" - set command "next" - } - -re ".*mac_init.*$gdb_prompt $" { - set description "next over mac_init and everything it calls" - set command "next" - } - -re ".*init_malloc.*$gdb_prompt $" { - set description "next over init_malloc and everything it calls" - set command "next" - } - -re ".*lim_at_start.*$gdb_prompt $" { - set description "next over lim_at_start initialization" - set command "next" - } - -re ".*count . 0x3.*$gdb_prompt $" { - set description "next over conditional stack alignment code 1" - set command "next" - } - -re ".*if .i != 0.*$gdb_prompt $" { - set description "next over conditional stack alignment code 2" - set command "next" - } - -re ".*alloca .i - 4.*$gdb_prompt $" { - set description "next over conditional stack alignment alloca" - set command "next" - } - -re ".*cmdsize = 1.*$gdb_prompt $" { - set description "step over cmdsize initialization" - set command "next" - } - -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { - set description "next over cmdarg initialization via xmalloc" - set command "next" - } - -re ".*ncmd = 0.*$gdb_prompt $" { - set description "next over ncmd initialization" - set command "next" - } - -re ".*dirsize = 1.*$gdb_prompt $" { - set description "next over dirsize initialization" - set command "next" - } - -re ".*dirarg = .* xmalloc.*$gdb_prompt $" { - return - } - -re ".*setlocale .LC_MESSAGES,.*$gdb_prompt $" { - set description "next over setlocale LC_MESSAGES" - set command "next" - } - -re ".*setlocale .LC_CTYPE,.*$gdb_prompt $" { - set description "next over setlocale LC_CTYPE" - set command "next" - } - -re ".*bindtextdomain .PACKAGE, LOCALEDIR.;.*$gdb_prompt $" { - set description "next over bindtextdomain" - set command "next" - } - -re ".*textdomain .PACKAGE.;.*$gdb_prompt $" { - set description "next over textdomain PACKAGE" - set command "next" - } - -re "\[0-9\]*\t\{\r\n$gdb_prompt $" { - set description "step over initial brace" - set command "step" - } - -re ".*current_directory = gdb_dirbuf.*$gdb_prompt $" { - set description "step over current_directory initialization" - set command "step" - } - -re ".*gdb_sysroot = .*$gdb_prompt $" { - # NOTE: carlton/2003-01-15: More optimization reordering, - # observed on GCC 3.1. - set description "step over gdb_sysroot initialization" - set command "step" - } - -re ".*ndir = 0.*$gdb_prompt $" { - set description "step over ndir initialization" - set command "step" - } - -re ".*instream = stdin.*$gdb_prompt $" { - set description "step over instream initialization" - set command "step" - } - -re ".*getcwd .gdb_dirbuf, sizeof .gdb_dirbuf..;.*$gdb_prompt $" { - set description "next over getcwd" - set command "next" - } - -re "\[ \t\]+\{\r\n$gdb_prompt $" { - setup_xfail "mips-*-irix5*" - fail "$description ended up at odd location" - } - -re ".*main.c.*No such file or directory.*$gdb_prompt $" { - setup_xfail "rs6000-*-aix3*" - fail "must be able to list source lines" - return - } - -re ".*$gdb_prompt $" { - fail "unknown source line after $description" - return - } - default { - fail "unknown source line near main" - return - } - } - send_gdb "$command\n" - gdb_expect { - -re ".*No such file or directory.\r\n$gdb_prompt $" { - fail "$description (no source available)" - } - -re ".*A file or directory .* does not exist..\r\n$gdb_prompt $" { - fail "$description (no source available)" - } - -re ".*$gdb_prompt $" { - pass "$description" - } - timeout { - fail "$description (timeout)" - } - } - } -} - -proc test_with_self { executable } { - global gdb_prompt - global tool - global det_file - global decimal - global timeout - - # load yourself into the debugger - # This can take a relatively long time, particularly for testing where - # the executable is being accessed over a network, or where gdb does not - # support partial symbols for a particular target and has to load the - # entire symbol table. Set the timeout to 10 minutes, which should be - # adequate for most environments (it *has* timed out with 5 min on a - # SPARCstation SLC under moderate load, so this isn't unreasonable). - # After gdb is started, set the timeout to 30 seconds for the duration - # of this test, and then back to the original value. - - set oldtimeout $timeout - set timeout 600 - verbose "Timeout is now $timeout seconds" 2 - if {[gdb_load $executable] <0} then { - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - return -1 - } - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - - # disassemble yourself - gdb_test "x/10i main" \ - "x/10i.*main.*main.$decimal.*main.$decimal.*" \ - "Disassemble main" - - # Set a breakpoint at main - gdb_test "break captured_main" \ - "Breakpoint.*at.* file.*, line.*" \ - "breakpoint in captured_main" - - # We'll need this when we send a ^C to GDB. Need to do it before we - # run the program and gdb starts saving and restoring tty states. - # On Ultrix, we don't need it and it is really slow (because shell_escape - # doesn't use vfork). - if ![istarget "*-*-ultrix*"] then { - gdb_test "shell stty intr '^C'" "" \ - "set interrupt character in test_with_self" - } - - # FIXME: If we put this after the run to main, the first list - # command doesn't print the same line as the current line where - # gdb is stopped. - gdb_test "set listsize 1" "" "set listsize to 1" - - # run yourself - # It may take a very long time for the inferior gdb to start (lynx), - # so we bump it back up for the duration of this command. - set timeout 600 - - set description "run until breakpoint at captured_main" - send_gdb "run -nw\n" - gdb_expect { - -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" { - pass "$description" - } - -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" { - xfail "$description (line numbers scrambled?)" - } - -re "vfork: No more processes.*$gdb_prompt $" { - fail "$description (out of virtual memory)" - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - return -1 - } - -re ".*$gdb_prompt $" { - fail "$description" - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - return -1 - } - timeout { - fail "$description (timeout)" - } - } - - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - - # do we have a version number ? - send_gdb "print version\n" - gdb_expect { - -re ".\[0-9\]+ = .\[0-9.\]+.*$gdb_prompt $" { - pass "printed version as string" - } - -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" { - pass "printed version as pointer" - } - -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" { - pass "printed version with cast" - } - -re ".*$gdb_prompt $" { fail "printed version" } - timeout { fail "(timeout) printed version" } - } - - do_steps_and_nexts - - gdb_test "print \"foo\"" ".\[0-9\]+ = \"foo\"" "print a string" - - # do_steps_and_nexts left us ready to execute an xmalloc call, - # so give that a try. - # If we don't actually enter the xmalloc call when we give a - # step command that seems like a genuine bug. It seems to happen - # on most RISC processors. - # NOTE drow/2003-06-22: However, if we step back to the preceding two - # lines, just keep stepping until we enter. - set stepped_back 0 - setup_xfail "alpha-*-*" "mips-*-*" - set description "step into xmalloc call" - send_gdb "step\n" - gdb_expect { - -re "ncmd = 0;.*$gdb_prompt $" { - set stepped_back 1 - send_gdb "step\n" - exp_continue - } - -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { - set stepped_back 1 - send_gdb "step\n" - exp_continue - } - -re "dirsize = 1;.*$gdb_prompt $" { - set stepped_back 1 - send_gdb "step\n" - exp_continue - } - -re ".*dirarg = .* xmalloc.*$gdb_prompt $" { - if { $stepped_back == 1 } { - send_gdb "step\n" - exp_continue - } else { - fail "$description" - } - } - -re "xmalloc.*size=.*at.*utils.c.*$gdb_prompt $" { - pass "$description" - } - -re ".*No such file or directory.\r\n$gdb_prompt $" { - pass "$description (no source available)" - } - -re "A file or directory .* does not exist..\r\n$gdb_prompt $" { - pass "$description (no source available)" - } - -re ".*$gdb_prompt $" { - fail "$description" - } - timeout { - fail "$description (timeout)" - } - } - - # start the "xgdb" process - send_gdb "continue\n" - gdb_expect { - -re "GNU gdb \[0-9\.\]*.* -Copyright \[0-9\]* Free Software Foundation, Inc.* -GDB is free software, covered by the GNU General Public License, and you are.* -welcome to change it and/or distribute copies of it under certain conditions.* -Type \"show copying\" to see the conditions.* -There is absolutely no warranty for GDB. Type \"show warranty\" for details.* -This GDB was configured as .*$gdb_prompt $"\ - { pass "xgdb is at prompt" } - -re "GDB is free software and you are welcome to distribute copies of it.* - under certain conditions; type \"show copying\" to see the conditions..* -There is absolutely no warranty for GDB; type \"show warranty\" for details..* -GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\ - { pass "xgdb is at prompt (obsolescent gdb)" } - -re ".*$gdb_prompt $" { fail "xgdb is at prompt" } - timeout { fail "(timeout) xgdb is at prompt" } - } - - # set xgdb prompt so we can tell which is which - send_gdb "set prompt (xgdb) \n" - gdb_expect { - -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $" { pass "Set xgdb prompt" } - -re ".*$gdb_prompt $" { fail "Set xgdb prompt" } - default { fail "(timeout) Set xgdb prompt" } - } - - # kill the xgdb process - set description "send ^C to child process" - send_gdb "\003" - gdb_expect { - -re "Program received signal SIGINT.*$gdb_prompt $" { - pass "$description" - } - -re ".*$gdb_prompt $" { - fail "$description" - } - timeout { - fail "$description (timeout)" - } - } - - set description "send SIGINT signal to child process" - send_gdb "signal SIGINT\n" - gdb_expect { - -re "Continuing with signal SIGINT.*$gdb_prompt $" { - pass "$description" - } - -re ".*$gdb_prompt $" { - fail "$description" - } - timeout { - fail "$description (timeout)" - } - } - - # get a stack trace - # - # This fails on some linux systems for unknown reasons. On the - # systems where it fails, sometimes it works fine when run manually. - # The testsuite failures may not be limited to just aout systems. - setup_xfail "i*86-pc-linuxaout-gnu" - set description "backtrace through signal handler" - send_gdb "backtrace\n" - gdb_expect { - -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { - pass "$description" - } - -re ".*$gdb_prompt $" { - # On the alpha, we hit the infamous problem about gdb - # being unable to get the frame pointer (mentioned in - # gdb/README). As it is intermittent, there is no way to - # XFAIL it which will give us an XPASS if the problem goes - # away. - setup_xfail "alpha*-*-osf*" - fail "$description" - } - timeout { - fail "$description (timeout)" - } - } - - - # Set the timeout back to the value it had when we were called. - set timeout $oldtimeout - verbose "Timeout is now $timeout seconds" 2 - - # Restart gdb in case next test expects it to be started already. - return 0 -} - -# Find a pathname to a file that we would execute if the shell was asked -# to run $arg using the current PATH. - -proc find_gdb { arg } { - - # If the arg directly specifies an existing executable file, then - # simply use it. - - if [file executable $arg] then { - return $arg - } - - set result [which $arg] - if [string match "/" [ string range $result 0 0 ]] then { - return $result - } - - # If everything fails, just return the unqualified pathname as default - # and hope for best. - - return $arg -} - -# Run the test with self. -# Copy the file executable file in case this OS doesn't like to edit its own -# text space. - -set GDB_FULLPATH [find_gdb $GDB] - -# Remove any old copy lying around. -remote_file host delete x$tool - -gdb_start -set file [remote_download host $GDB_FULLPATH x$tool] -set result [test_with_self $file]; -gdb_exit; -catch "remote_file host delete $file"; - -if {$result <0} then { - warning "Couldn't test self" - return -1 -} diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest.exp new file mode 100644 index 0000000..4196b74 --- /dev/null +++ b/gdb/testsuite/gdb.gdb/selftest.exp @@ -0,0 +1,516 @@ +# Copyright 1988, 1990, 1991, 1992, 1994, 1997, 1999, 2000, 2002, 2003 +# 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 +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +# This file was written by Rob Savoye. (rob@cygnus.com) + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +# are we on a target board +if [is_remote target] { + return +} + +# Not all of the lines of code near the start of main are executed for +# every machine. Also, optimization may reorder some of the lines. +# So all we do is try to step or next over everything until we get +# to a line that we know is always executed. + +proc do_steps_and_nexts {} { + global gdb_prompt + global srcdir + + gdb_reinitialize_dir $srcdir/.. + + for {set count 0} {$count < 32} {incr count} { + send_gdb "list\n" + # NOTE: carlton/2002-12-11: The "initial brace" and + # "current_directory initialization" possibilities happen to + # me with GCC 3.1 on i686-pc-linux-gnu when I compile with + # optimization. + gdb_expect { + -re ".*context = data.*$gdb_prompt $" { + set description "step over context initialization" + set command "step" + } + -re ".*argc = context->argc.*$gdb_prompt $" { + set description "step over argc initialization" + set command "step" + } + -re ".*argv = context->argv.*$gdb_prompt $" { + set description "step over argv initialization" + set command "step" + } + -re ".*quiet = 0.*$gdb_prompt $" { + set description "step over quiet initialization" + set command "step" + } + -re ".*batch = 0.*$gdb_prompt $" { + set description "step over batch initialization" + set command "step" + } + -re ".*symarg = NULL.*$gdb_prompt $" { + set description "step over symarg initialization" + set command "step" + } + -re ".*execarg = NULL.*$gdb_prompt $" { + set description "step over execarg initialization" + set command "step" + } + -re ".*corearg = NULL.*$gdb_prompt $" { + set description "step over corearg initialization" + set command "step" + } + -re ".*cdarg = NULL.*$gdb_prompt $" { + set description "step over cdarg initialization" + set command "step" + } + -re ".*ttyarg = NULL.*$gdb_prompt $" { + set description "step over ttyarg initialization" + set command "step" + } + -re ".*time_at_startup = get_run_time.*$gdb_prompt $" { + set description "next over get_run_time and everything it calls" + set command "next" + } + -re ".*START_PROGRESS.*$gdb_prompt $" { + # Note: ezannoni/2004/02/17: This check should be + # removed, since as of today that source line is not + # in gdb anymore. + set description "next over START_PROGRESS and everything it calls" + set command "next" + } + -re ".*mac_init.*$gdb_prompt $" { + set description "next over mac_init and everything it calls" + set command "next" + } + -re ".*init_malloc.*$gdb_prompt $" { + set description "next over init_malloc and everything it calls" + set command "next" + } + -re ".*lim_at_start.*$gdb_prompt $" { + set description "next over lim_at_start initialization" + set command "next" + } + -re ".*count . 0x3.*$gdb_prompt $" { + set description "next over conditional stack alignment code 1" + set command "next" + } + -re ".*if .i != 0.*$gdb_prompt $" { + set description "next over conditional stack alignment code 2" + set command "next" + } + -re ".*alloca .i - 4.*$gdb_prompt $" { + set description "next over conditional stack alignment alloca" + set command "next" + } + -re ".*cmdsize = 1.*$gdb_prompt $" { + set description "step over cmdsize initialization" + set command "next" + } + -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { + set description "next over cmdarg initialization via xmalloc" + set command "next" + } + -re ".*ncmd = 0.*$gdb_prompt $" { + set description "next over ncmd initialization" + set command "next" + } + -re ".*dirsize = 1.*$gdb_prompt $" { + set description "next over dirsize initialization" + set command "next" + } + -re ".*dirarg = .* xmalloc.*$gdb_prompt $" { + return + } + -re ".*setlocale .LC_MESSAGES,.*$gdb_prompt $" { + set description "next over setlocale LC_MESSAGES" + set command "next" + } + -re ".*setlocale .LC_CTYPE,.*$gdb_prompt $" { + set description "next over setlocale LC_CTYPE" + set command "next" + } + -re ".*bindtextdomain .PACKAGE, LOCALEDIR.;.*$gdb_prompt $" { + set description "next over bindtextdomain" + set command "next" + } + -re ".*textdomain .PACKAGE.;.*$gdb_prompt $" { + set description "next over textdomain PACKAGE" + set command "next" + } + -re "\[0-9\]*\t\{\r\n$gdb_prompt $" { + set description "step over initial brace" + set command "step" + } + -re ".*current_directory = gdb_dirbuf.*$gdb_prompt $" { + set description "step over current_directory initialization" + set command "step" + } + -re ".*gdb_sysroot = .*$gdb_prompt $" { + # NOTE: carlton/2003-01-15: More optimization reordering, + # observed on GCC 3.1. + set description "step over gdb_sysroot initialization" + set command "step" + } + -re ".*ndir = 0.*$gdb_prompt $" { + set description "step over ndir initialization" + set command "step" + } + -re ".*instream = stdin.*$gdb_prompt $" { + set description "step over instream initialization" + set command "step" + } + -re ".*getcwd .gdb_dirbuf, sizeof .gdb_dirbuf..;.*$gdb_prompt $" { + set description "next over getcwd" + set command "next" + } + -re "\[ \t\]+\{\r\n$gdb_prompt $" { + setup_xfail "mips-*-irix5*" + fail "$description ended up at odd location" + } + -re ".*main.c.*No such file or directory.*$gdb_prompt $" { + setup_xfail "rs6000-*-aix3*" + fail "must be able to list source lines" + return + } + -re ".*$gdb_prompt $" { + fail "unknown source line after $description" + return + } + default { + fail "unknown source line near main" + return + } + } + send_gdb "$command\n" + gdb_expect { + -re ".*No such file or directory.\r\n$gdb_prompt $" { + fail "$description (no source available)" + } + -re ".*A file or directory .* does not exist..\r\n$gdb_prompt $" { + fail "$description (no source available)" + } + -re ".*$gdb_prompt $" { + pass "$description" + } + timeout { + fail "$description (timeout)" + } + } + } +} + +proc test_with_self { executable } { + global gdb_prompt + global tool + global det_file + global decimal + global timeout + + # load yourself into the debugger + # This can take a relatively long time, particularly for testing where + # the executable is being accessed over a network, or where gdb does not + # support partial symbols for a particular target and has to load the + # entire symbol table. Set the timeout to 10 minutes, which should be + # adequate for most environments (it *has* timed out with 5 min on a + # SPARCstation SLC under moderate load, so this isn't unreasonable). + # After gdb is started, set the timeout to 30 seconds for the duration + # of this test, and then back to the original value. + + set oldtimeout $timeout + set timeout 600 + verbose "Timeout is now $timeout seconds" 2 + if {[gdb_load $executable] <0} then { + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # disassemble yourself + gdb_test "x/10i main" \ + "x/10i.*main.*main.$decimal.*main.$decimal.*" \ + "Disassemble main" + + # Set a breakpoint at main + gdb_test "break captured_main" \ + "Breakpoint.*at.* file.*, line.*" \ + "breakpoint in captured_main" + + # We'll need this when we send a ^C to GDB. Need to do it before we + # run the program and gdb starts saving and restoring tty states. + # On Ultrix, we don't need it and it is really slow (because shell_escape + # doesn't use vfork). + if ![istarget "*-*-ultrix*"] then { + gdb_test "shell stty intr '^C'" "" \ + "set interrupt character in test_with_self" + } + + # FIXME: If we put this after the run to main, the first list + # command doesn't print the same line as the current line where + # gdb is stopped. + gdb_test "set listsize 1" "" "set listsize to 1" + + # run yourself + # It may take a very long time for the inferior gdb to start (lynx), + # so we bump it back up for the duration of this command. + set timeout 600 + + set description "run until breakpoint at captured_main" + send_gdb "run -nw\n" + gdb_expect { + -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" { + pass "$description" + } + -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" { + xfail "$description (line numbers scrambled?)" + } + -re "vfork: No more processes.*$gdb_prompt $" { + fail "$description (out of virtual memory)" + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + -re ".*$gdb_prompt $" { + fail "$description" + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + return -1 + } + timeout { + fail "$description (timeout)" + } + } + + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # do we have a version number ? + send_gdb "print version\n" + gdb_expect { + -re ".\[0-9\]+ = .\[0-9.\]+.*$gdb_prompt $" { + pass "printed version as string" + } + -re ".\[0-9\]+ = +0x.*\[0-9.\]+.*$gdb_prompt $" { + pass "printed version as pointer" + } + -re ".\[0-9\]+ = +.+ +0x.*\[0-9.\]+.*$gdb_prompt $" { + pass "printed version with cast" + } + -re ".*$gdb_prompt $" { fail "printed version" } + timeout { fail "(timeout) printed version" } + } + + do_steps_and_nexts + + gdb_test "print \"foo\"" ".\[0-9\]+ = \"foo\"" "print a string" + + # do_steps_and_nexts left us ready to execute an xmalloc call, + # so give that a try. + # If we don't actually enter the xmalloc call when we give a + # step command that seems like a genuine bug. It seems to happen + # on most RISC processors. + # NOTE drow/2003-06-22: However, if we step back to the preceding two + # lines, just keep stepping until we enter. + set stepped_back 0 + setup_xfail "alpha-*-*" "mips-*-*" + set description "step into xmalloc call" + send_gdb "step\n" + gdb_expect { + -re "ncmd = 0;.*$gdb_prompt $" { + set stepped_back 1 + send_gdb "step\n" + exp_continue + } + -re ".*cmdarg = .* xmalloc.*$gdb_prompt $" { + set stepped_back 1 + send_gdb "step\n" + exp_continue + } + -re "dirsize = 1;.*$gdb_prompt $" { + set stepped_back 1 + send_gdb "step\n" + exp_continue + } + -re ".*dirarg = .* xmalloc.*$gdb_prompt $" { + if { $stepped_back == 1 } { + send_gdb "step\n" + exp_continue + } else { + fail "$description" + } + } + -re "xmalloc.*size=.*at.*utils.c.*$gdb_prompt $" { + pass "$description" + } + -re ".*No such file or directory.\r\n$gdb_prompt $" { + pass "$description (no source available)" + } + -re "A file or directory .* does not exist..\r\n$gdb_prompt $" { + pass "$description (no source available)" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + # start the "xgdb" process + send_gdb "continue\n" + gdb_expect { + -re "GNU gdb \[0-9\.\]*.* +Copyright \[0-9\]* Free Software Foundation, Inc.* +GDB is free software, covered by the GNU General Public License, and you are.* +welcome to change it and/or distribute copies of it under certain conditions.* +Type \"show copying\" to see the conditions.* +There is absolutely no warranty for GDB. Type \"show warranty\" for details.* +This GDB was configured as .*$gdb_prompt $"\ + { pass "xgdb is at prompt" } + -re "GDB is free software and you are welcome to distribute copies of it.* + under certain conditions; type \"show copying\" to see the conditions..* +There is absolutely no warranty for GDB; type \"show warranty\" for details..* +GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\ + { pass "xgdb is at prompt (obsolescent gdb)" } + -re ".*$gdb_prompt $" { fail "xgdb is at prompt" } + timeout { fail "(timeout) xgdb is at prompt" } + } + + # set xgdb prompt so we can tell which is which + send_gdb "set prompt (xgdb) \n" + gdb_expect { + -re "\[(\]xgdb\[)\].*\[(\]xgdb\[)\] $" { pass "Set xgdb prompt" } + -re ".*$gdb_prompt $" { fail "Set xgdb prompt" } + default { fail "(timeout) Set xgdb prompt" } + } + + # kill the xgdb process + set description "send ^C to child process" + send_gdb "\003" + gdb_expect { + -re "Program received signal SIGINT.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + set description "send SIGINT signal to child process" + send_gdb "signal SIGINT\n" + gdb_expect { + -re "Continuing with signal SIGINT.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + # get a stack trace + # + # This fails on some linux systems for unknown reasons. On the + # systems where it fails, sometimes it works fine when run manually. + # The testsuite failures may not be limited to just aout systems. + setup_xfail "i*86-pc-linuxaout-gnu" + set description "backtrace through signal handler" + send_gdb "backtrace\n" + gdb_expect { + -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" { + pass "$description" + } + -re ".*$gdb_prompt $" { + # On the alpha, we hit the infamous problem about gdb + # being unable to get the frame pointer (mentioned in + # gdb/README). As it is intermittent, there is no way to + # XFAIL it which will give us an XPASS if the problem goes + # away. + setup_xfail "alpha*-*-osf*" + fail "$description" + } + timeout { + fail "$description (timeout)" + } + } + + + # Set the timeout back to the value it had when we were called. + set timeout $oldtimeout + verbose "Timeout is now $timeout seconds" 2 + + # Restart gdb in case next test expects it to be started already. + return 0 +} + +# Find a pathname to a file that we would execute if the shell was asked +# to run $arg using the current PATH. + +proc find_gdb { arg } { + + # If the arg directly specifies an existing executable file, then + # simply use it. + + if [file executable $arg] then { + return $arg + } + + set result [which $arg] + if [string match "/" [ string range $result 0 0 ]] then { + return $result + } + + # If everything fails, just return the unqualified pathname as default + # and hope for best. + + return $arg +} + +# Run the test with self. +# Copy the file executable file in case this OS doesn't like to edit its own +# text space. + +set GDB_FULLPATH [find_gdb $GDB] + +# Remove any old copy lying around. +remote_file host delete x$tool + +gdb_start +set file [remote_download host $GDB_FULLPATH x$tool] +set result [test_with_self $file]; +gdb_exit; +catch "remote_file host delete $file"; + +if {$result <0} then { + warning "Couldn't test self" + return -1 +} -- cgit v1.1