X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.base%2Fbreak.exp;h=2b4587e9e637c015626f9c256b1579b0b495640b;hb=5d5658a1d3c3eb2a09c03f2f0662a1c01963c869;hp=4a704fbc6d98da97105680272e8ccebe5715e1cd;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.base/break.exp b/gdb/testsuite/gdb.base/break.exp index 4a704fbc6d..2b4587e9e6 100644 --- a/gdb/testsuite/gdb.base/break.exp +++ b/gdb/testsuite/gdb.base/break.exp @@ -1,66 +1,25 @@ -# Copyright 1988, 1990, 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2002, 2003 -# Free Software Foundation, Inc. +# Copyright 1988-2016 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 +# the Free Software Foundation; either version 3 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 +# along with this program. If not, see . # This file was written by Rob Savoye. (rob@cygnus.com) -if $tracelevel then { - strace $tracelevel -} - - -# -# test running programs -# -set prms_id 0 -set bug_id 0 - -set testfile "break" -set srcfile ${testfile}.c -set srcfile1 ${testfile}1.c -set binfile ${objdir}/${subdir}/${testfile} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfile}] { +if { [prepare_for_testing break.exp "break" {break.c break1.c} {debug nowarnings}] } { return -1 } - -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfile} - -if [target_info exists gdb_stub] { - gdb_step_for_stub; -} +set srcfile break.c +set srcfile1 break1.c # # test simple breakpoint setting commands # @@ -118,7 +77,7 @@ set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] # board. So, to be sure, we do a list command. # gdb_test "list main" \ - ".*main \\(argc, argv, envp\\).*" \ + ".*main \\(int argc, char \\*\\*argv, char \\*\\*envp\\).*" \ "use `list' to establish default source file" gdb_test "break $bp_location1" \ "Breakpoint.*at.* file .*$srcfile, line $bp_location1\\." \ @@ -155,33 +114,18 @@ gdb_test "break multi_line_while_conditional" \ "Breakpoint.*at.* file .*$srcfile, line $bp_location4\\." \ "breakpoint at start of multi line while conditional" -set bp_location5 [gdb_get_line_number "set breakpoint 5 here"] set bp_location6 [gdb_get_line_number "set breakpoint 6 here"] -# -# check to see what breakpoints are set -# -if [target_info exists gdb_stub] { - set main_line $bp_location5 -} else { - set main_line $bp_location6 -} - -if {$hp_aCC_compiler} { - set proto "\\(int\\)" -} else { - set proto "" -} +set main_line $bp_location6 set bp_location7 [gdb_get_line_number "set breakpoint 7 here"] set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile1] -set bp_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile1] gdb_test "info break" \ - "Num Type\[ \]+Disp Enb Address\[ \]+What.* + "Num Type\[ \]+Disp Enb Address\[ \]+What.* \[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$main_line.* -\[0-9\]+\[\t \]+breakpoint keep y.* in marker2 at .*$srcfile1:($bp_location8|$bp_location9).* -\[0-9\]+\[\t \]+breakpoint keep y.* in factorial$proto at .*$srcfile:$bp_location7.* +\[0-9\]+\[\t \]+breakpoint keep y.* in marker2 at .*$srcfile1:$bp_location8.* +\[0-9\]+\[\t \]+breakpoint keep y.* in factorial at .*$srcfile:$bp_location7.* \[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location1.* \[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location1.* \[0-9\]+\[\t \]+breakpoint keep y.* in main at .*$srcfile:$bp_location2.* @@ -189,41 +133,235 @@ gdb_test "info break" \ \[0-9\]+\[\t \]+breakpoint keep y.* in multi_line_while_conditional at .*$srcfile:$bp_location4" \ "breakpoint info" -# FIXME: The rest of this test doesn't work with anything that can't -# handle arguments. -# Huh? There doesn't *appear* to be anything that passes arguments -# below. -if [istarget "mips-idt-*"] then { - return +# +# Test info breakpoint with arguments +# + +set see1 0 +set see2 0 +set see3 0 +set see4 0 +set see5 0 +set see6 0 + +gdb_test_multiple "info break 2 4 6" "info break 2 4 6" { + -re "1\[\t \]+breakpoint *keep y\[^\r\n\]*:$main_line\[^\r\n\]*" { + set see1 1 + exp_continue + } + -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" { + set see2 1 + exp_continue + } + -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" { + set see3 1 + exp_continue + } + -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see4 1 + exp_continue + } + -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see5 1 + exp_continue + } + -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" { + set see6 1 + exp_continue + } + -re ".*$gdb_prompt $" { + if { !$see1 && $see2 && !$see3 && $see4 && !$see5 && $see6 } then { + pass "info break 2 4 6" + } else { + fail "info break 2 4 6" + } + } +} + +set see1 0 +set see2 0 +set see3 0 +set see4 0 +set see5 0 +set see6 0 + +gdb_test_multiple "info break 3-5" "info break 3-5" { + -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" { + set see1 1 + exp_continue + } + -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" { + set see2 1 + exp_continue + } + -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" { + set see3 1 + exp_continue + } + -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see4 1 + exp_continue + } + -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see5 1 + exp_continue + } + -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" { + set see6 1 + exp_continue + } + -re ".*$gdb_prompt $" { + if { !$see1 && !$see2 && $see3 && $see4 && $see5 && !$see6 } then { + pass "info break 3-5" + } else { + fail "info break 3-5" + } + } } # -# run until the breakpoint at main is hit. For non-stubs-using targets. +# Test disable/enable with arguments # -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" + +# Test with value history + +gdb_test "print 1" "" "" +gdb_test "print 2" "" "" +gdb_test "print 3" "" "" +gdb_test "print 4" "" "" +gdb_test "print 5" "" "" +gdb_test "print 6" "" "" + +# $2 is 2 and $$ is 5 +gdb_test_no_output "disable \$2 \$\$" "disable using history values" + +set see1 0 +set see2 0 +set see3 0 +set see4 0 +set see5 0 +set see6 0 + +gdb_test_multiple "info break" "check disable with history values" { + -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" { + set see1 1 exp_continue } - -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 "2\[\t \]+breakpoint *keep n\[^\r\n\]* in marker2 at \[^\r\n\]*" { + set see2 1 + exp_continue + } + -re "3\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location7\[^\r\n\]*" { + set see3 1 + exp_continue + } + -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see4 1 + exp_continue + } + -re "5\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see5 1 + exp_continue + } + -re "6\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location2\[^\r\n\]*" { + set see6 1 + exp_continue + } + -re ".*$gdb_prompt $" { + if { $see1 && $see2 && $see3 && $see4 && $see5 && $see6 } then { + pass "check disable with history values" + } else { + fail "check disable with history values" + } } } +gdb_test "enable" "" "" +gdb_test "set \$foo = 3" "" "" +gdb_test "set \$bar = 6" "" "" +gdb_test_no_output "disable \$foo \$bar" "disable with convenience values" + +set see1 0 +set see2 0 +set see3 0 +set see4 0 +set see5 0 +set see6 0 + +gdb_test_multiple "info break" "check disable with convenience values" { + -re "1\[\t \]+breakpoint *keep y.* in main at .*:$main_line\[^\r\n\]*" { + set see1 1 + exp_continue + } + -re "2\[\t \]+breakpoint *keep y\[^\r\n\]* in marker2 at \[^\r\n\]*" { + set see2 1 + exp_continue + } + -re "3\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location7\[^\r\n\]*" { + set see3 1 + exp_continue + } + -re "4\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see4 1 + exp_continue + } + -re "5\[\t \]+breakpoint *keep y\[^\r\n\]*$bp_location1\[^\r\n\]*" { + set see5 1 + exp_continue + } + -re "6\[\t \]+breakpoint *keep n\[^\r\n\]*$bp_location2\[^\r\n\]*" { + set see6 1 + exp_continue + } + -re ".*$gdb_prompt $" { + if { $see1 && $see2 && $see3 && $see4 && $see5 && $see6 } then { + pass "check disable with convenience values" + } else { + fail "check disable with convenience values" + } + } +} + +# test with bad values + +gdb_test "enable" "" "" +gdb_test "disable 10" "No breakpoint number 10." \ + "disable non-existent breakpoint 10" + +gdb_test_no_output "set \$baz = 1.234" +gdb_test "disable \$baz" \ + "Convenience variable must have integer value.*" \ + "disable with non-integer convenience var" +gdb_test "disable \$grbx" \ + "Convenience variable must have integer value.*" \ + "disable with non-existent convenience var" +gdb_test "disable \$10" \ + "History has not yet reached .10." \ + "disable with non-existent history value" +gdb_test "disable \$1foo" \ + "Convenience variable must have integer value.*" \ + "disable with badly formed history value" + +# FIXME: The rest of this test doesn't work with anything that can't +# handle arguments. +# Huh? There doesn't *appear* to be anything that passes arguments +# below. + +# +# run until the breakpoint at main is hit. For non-stubs-using targets. +# +gdb_run_cmd +gdb_test "" \ + "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*" \ + "run until function breakpoint" + +# Test the 'list' commands sets current file for the 'break LINENO' command. +set bp_marker1 [gdb_get_line_number "set breakpoint 15 here" ${srcfile1}] +gdb_test "list marker1" ".*" +gdb_test "break $bp_marker1" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*${srcfile1}, line ${bp_marker1}\\." \ + "break lineno" +gdb_test_no_output {delete $bpnum} + # # run until the breakpoint at a line number # @@ -241,7 +379,7 @@ for {set i 6} {$i >= 1} {incr i -1} { # # Run until the breakpoint set at a quoted function # -gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, (0x\[0-9a-f\]+ in )?marker2 \\(a=43\\) at .*$srcfile1:($bp_location8|$bp_location9).*" \ +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, (0x\[0-9a-f\]+ in )?marker2 \\(a=43\\) at .*$srcfile1:$bp_location8.*" \ "run until quoted breakpoint" # # run until the file:function breakpoint at a line number in a file @@ -262,6 +400,17 @@ gdb_test "step" \ ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10.*$bp_location10\[\t \]+return argc;.*breakpoint 10 here.*" \ "step onto breakpoint" +# Check to see if breakpoint can be set on ending brace of function +set bp_location10a [gdb_get_line_number "set breakpoint 10a here"] + +gdb_test "break $bp_location10a" \ + "Breakpoint.*at.* file .*$srcfile, line $bp_location10a\\." \ + "setting breakpoint at }" + +gdb_test "continue" \ + ".*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location10a.*$bp_location10a\[\t \]+}.*breakpoint 10a here.*" \ + "continue to breakpoint at }" + # # delete all breakpoints so we can start over, course this can be a test too # @@ -271,46 +420,40 @@ delete_breakpoints # test temporary breakpoint at function # -gdb_test "tbreak main" "Breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function" +gdb_test "tbreak main" "Temporary breakpoint.*at.* file .*$srcfile, line.*" "Temporary breakpoint function" # # test break at function in file # -gdb_test "tbreak $srcfile:factorial" "Breakpoint.*at.* file .*$srcfile, line.*" \ +gdb_test "tbreak $srcfile:factorial" "Temporary breakpoint.*at.* file .*$srcfile, line.*" \ "Temporary breakpoint function in file" # # test break at line number # -send_gdb "tbreak $bp_location1\n" -gdb_expect { - -re "Breakpoint.*at.* file .*$srcfile, line $bp_location1.*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } - -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number #1" } - timeout { fail "breakpoint line number #1 (timeout)" } -} +gdb_test "tbreak $bp_location1" \ + "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location1.*" \ + "Temporary breakpoint line number #1" -gdb_test "tbreak $bp_location6" "Breakpoint.*at.* file .*$srcfile, line $bp_location6.*" "Temporary breakpoint line number #2" +gdb_test "tbreak $bp_location6" "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location6.*" "Temporary breakpoint line number #2" # # test break at line number in file # -send_gdb "tbreak $srcfile:$bp_location2\n" -gdb_expect { - -re "Breakpoint.*at.* file .*$srcfile, line $bp_location2.*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } - -re ".*$gdb_prompt $" { pass "Temporary breakpoint line number in file #1" } - timeout { fail "Temporary breakpoint line number in file #1 (timeout)" } -} +gdb_test "tbreak $srcfile:$bp_location2" \ + "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location2.*" \ + "Temporary breakpoint line number in file #1" set bp_location11 [gdb_get_line_number "set breakpoint 11 here"] -gdb_test "tbreak $srcfile:$bp_location11" "Breakpoint.*at.* file .*$srcfile, line $bp_location11.*" "Temporary breakpoint line number in file #2" +gdb_test "tbreak $srcfile:$bp_location11" "Temporary breakpoint.*at.* file .*$srcfile, line $bp_location11.*" "Temporary breakpoint line number in file #2" # # check to see what breakpoints are set (temporary this time) # -gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\] +gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\] \[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$main_line.*\[\r\n\] -\[0-9\]+\[\t \]+breakpoint del.*y.*in factorial$proto at .*$srcfile:$bp_location7.*\[\r\n\] +\[0-9\]+\[\t \]+breakpoint del.*y.*in factorial at .*$srcfile:$bp_location7.*\[\r\n\] \[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location1.*\[\r\n\] \[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location6.*\[\r\n\] \[0-9\]+\[\t \]+breakpoint del.*y.*in main at .*$srcfile:$bp_location2.*\[\r\n\] @@ -326,173 +469,76 @@ gdb_test "info break" "Num Type.*Disp Enb Address.*What.*\[\r\n\] # if ![runto_main] then { fail "break tests suppressed" } -send_gdb "catch\n" -gdb_expect { - -re "Catch requires an event name.*$gdb_prompt $"\ - {pass "catch requires an event name"} - -re "$gdb_prompt $"\ - {fail "catch requires an event name"} - timeout {fail "(timeout) catch requires an event name"} -} - - -set name "set catch fork, never expected to trigger" -send_gdb "catch fork\n" -gdb_expect { - -re "Catchpoint \[0-9\]* .fork..*$gdb_prompt $" - {pass $name} - -re "Catch of fork not yet implemented.*$gdb_prompt $" - {pass $name} - -re "$gdb_prompt $" - {fail $name} - timeout {fail "(timeout) $name"} -} +gdb_test "catch" \ + "Catch requires an event name." \ + "catch requires an event name" +gdb_test "catch fork" "Catchpoint \[0-9\]+ \\(fork\\)" \ + "set catch fork, never expected to trigger" -set name "set catch vfork, never expected to trigger" -send_gdb "catch vfork\n" +gdb_test "catch vfork" "Catchpoint \[0-9\]+ \\(vfork\\)" \ + "set catch vfork, never expected to trigger" -# If we are on HP-UX 10.20, we expect an error message to be -# printed if we type "catch vfork" at the gdb gdb_prompt. This is -# because on HP-UX 10.20, we cannot catch vfork events. - -if [istarget "hppa*-hp-hpux10.20"] then { - gdb_expect { - -re "Catch of vfork events not supported on HP-UX 10.20..*$gdb_prompt $" - {pass $name} - -re "$gdb_prompt $" - {fail $name} - timeout {fail "(timeout) $name"} - } -} else { - gdb_expect { - -re "Catchpoint \[0-9\]* .vfork..*$gdb_prompt $" - {pass $name} - -re "Catch of vfork not yet implemented.*$gdb_prompt $" - {pass $name} - -re "$gdb_prompt $" - {fail $name} - timeout {fail "(timeout) $name"} - } -} - -set name "set catch exec, never expected to trigger" -send_gdb "catch exec\n" -gdb_expect { - -re "Catchpoint \[0-9\]* .exec..*$gdb_prompt $" - {pass $name} - -re "Catch of exec not yet implemented.*$gdb_prompt $" - {pass $name} - -re "$gdb_prompt $" {fail $name} - timeout {fail "(timeout) $name"} -} +gdb_test "catch exec" "Catchpoint \[0-9\]+ \\(exec\\)" \ + "set catch exec, never expected to trigger" # Verify that GDB responds gracefully when asked to set a breakpoint # on a nonexistent source line. # -send_gdb "break 999\n" -gdb_expect { - -re "No line 999 in file .*$gdb_prompt $"\ - {pass "break on non-existent source line"} - -re "$gdb_prompt $"\ - {fail "break on non-existent source line"} - timeout {fail "(timeout) break on non-existent source line"} -} +gdb_test_no_output "set breakpoint pending off" +gdb_test "break 999" \ + "No line 999 in the current file." \ + "break on non-existent source line" # Run to the desired default location. If not positioned here, the # tests below don't work. # -gdb_test "until $bp_location1" "main .* at .*:$bp_location1.*" "until bp_location1" - +gdb_test "until $bp_location1" "main .* at .*:$bp_location1.*" \ + "until bp_location1" # Verify that GDB allows one to just say "break", which is treated # as the "default" breakpoint. Note that GDB gets cute when printing # the informational message about other breakpoints at the same # location. We'll hit that bird with this stone too. # -send_gdb "break\n" -gdb_expect { - -re "Breakpoint \[0-9\]*.*$gdb_prompt $"\ - {pass "break on default location, 1st time"} - -re "$gdb_prompt $"\ - {fail "break on default location, 1st time"} - timeout {fail "(timeout) break on default location, 1st time"} -} +gdb_test "break" "Breakpoint \[0-9\]*.*" \ + "break on default location, 1st time" -send_gdb "break\n" -gdb_expect { - -re "Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ - {pass "break on default location, 2nd time"} - -re "$gdb_prompt $"\ - {fail "break on default location, 2nd time"} - timeout {fail "(timeout) break on default location, 2nd time"} -} +gdb_test "break" \ + "Note: breakpoint \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \ + "break on default location, 2nd time" -send_gdb "break\n" -gdb_expect { - -re "Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ - {pass "break on default location, 3rd time"} - -re "$gdb_prompt $"\ - {fail "break on default location, 3rd time"} - timeout {fail "(timeout) break on default location, 3rd time"} -} +gdb_test "break" \ + "Note: breakpoints \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \ + "break on default location, 3rd time" -send_gdb "break\n" -gdb_expect { - -re "Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*$gdb_prompt $"\ - {pass "break on default location, 4th time"} - -re "$gdb_prompt $"\ - {fail "break on default location, 4th time"} - timeout {fail "(timeout) break on default location, 4th time"} -} +gdb_test "break" \ + "Note: breakpoints \[0-9\]*, \[0-9\]* and \[0-9\]* also set at .*Breakpoint \[0-9\]*.*" \ + "break on default location, 4th time" # Verify that a "silent" breakpoint can be set, and that GDB is indeed # "silent" about its triggering. # if ![runto_main] then { fail "break tests suppressed" } -send_gdb "break $bp_location1\n" -gdb_expect { - -re "Breakpoint (\[0-9\]*) at .*, line $bp_location1.*$gdb_prompt $"\ - {pass "set to-be-silent break bp_location1"} - -re "$gdb_prompt $"\ - {fail "set to-be-silent break bp_location1"} - timeout {fail "(timeout) set to-be-silent break bp_location1"} -} +gdb_test_multiple "break $bp_location1" \ + "set to-be-silent break bp_location1" { + -re "Breakpoint (\[0-9\]*) at .*, line $bp_location1.*$gdb_prompt $" { + pass "set to-be-silent break bp_location1" + } + } -send_gdb "commands $expect_out(1,string)\n" -send_gdb "silent\n" -send_gdb "end\n" -gdb_expect { - -re ".*$gdb_prompt $"\ - {pass "set silent break bp_location1"} - timeout {fail "(timeout) set silent break bp_location1"} -} +gdb_test "commands $expect_out(1,string)\nsilent\nend" ">end" "set silent break bp_location1" -send_gdb "info break $expect_out(1,string)\n" -gdb_expect { - -re "\[0-9\]*\[ \t\]*breakpoint.*:$bp_location1\r\n\[ \t\]*silent.*$gdb_prompt $"\ - {pass "info silent break bp_location1"} - -re "$gdb_prompt $"\ - {fail "info silent break bp_location1"} - timeout {fail "(timeout) info silent break bp_location1"} -} -send_gdb "continue\n" -gdb_expect { - -re "Continuing.\r\n$gdb_prompt $"\ - {pass "hit silent break bp_location1"} - -re "$gdb_prompt $"\ - {fail "hit silent break bp_location1"} - timeout {fail "(timeout) hit silent break bp_location1"} -} -send_gdb "bt\n" -gdb_expect { - -re "#0 main .* at .*:$bp_location1.*$gdb_prompt $"\ - {pass "stopped for silent break bp_location1"} - -re "$gdb_prompt $"\ - {fail "stopped for silent break bp_location1"} - timeout {fail "(timeout) stopped for silent break bp_location1"} -} +gdb_test "info break $expect_out(1,string)" \ + "\[0-9\]*\[ \t\]*breakpoint.*:$bp_location1\r\n\[ \t\]*silent.*" \ + "info silent break bp_location1" + +gdb_test "continue" "Continuing." \ + "hit silent break bp_location1" + +gdb_test "bt" "#0 main .* at .*:$bp_location1.*" \ + "stopped for silent break bp_location1" # Verify that GDB can at least parse a breakpoint with the # "thread" keyword. (We won't attempt to test here that a @@ -500,61 +546,31 @@ gdb_expect { # The gdb.threads subdirectory contains tests for that.) # set bp_location12 [gdb_get_line_number "set breakpoint 12 here"] -send_gdb "break $bp_location12 thread 999\n" -gdb_expect { - -re "Unknown thread 999.*$gdb_prompt $"\ - {pass "thread-specific breakpoint on non-existent thread disallowed"} - -re "$gdb_prompt $"\ - {fail "thread-specific breakpoint on non-existent thread disallowed"} - timeout {fail "(timeout) thread-specific breakpoint on non-existent thread disallowed"} -} -send_gdb "break $bp_location12 thread foo\n" -gdb_expect { - -re "Junk after thread keyword..*$gdb_prompt $"\ - {pass "thread-specific breakpoint on bogus thread ID disallowed"} - -re "$gdb_prompt $"\ - {fail "thread-specific breakpoint on bogus thread ID disallowed"} - timeout {fail "(timeout) thread-specific breakpoint on bogus thread ID disallowed"} -} +gdb_test "break $bp_location12 thread 999" "Unknown thread 999.*" \ + "thread-specific breakpoint on non-existent thread disallowed" + +gdb_test "break $bp_location12 thread foo" \ + "Invalid thread ID: foo" \ + "thread-specific breakpoint on bogus thread ID disallowed" # Verify that GDB responds gracefully to a breakpoint command with # trailing garbage. # -send_gdb "break $bp_location12 foo\n" -gdb_expect { - -re "Junk at end of arguments..*$gdb_prompt $"\ - {pass "breakpoint with trailing garbage disallowed"} - -re "$gdb_prompt $"\ - {fail "breakpoint with trailing garbage disallowed"} - timeout {fail "(timeout) breakpoint with trailing garbage disallowed"} -} +gdb_test "break $bp_location12 foo" \ + "malformed linespec error: unexpected string, \"foo\".*" \ + "breakpoint with trailing garbage disallowed" # Verify that GDB responds gracefully to a "clear" command that has # no matching breakpoint. (First, get us off the current source line, # which we know has a breakpoint.) # -send_gdb "next\n" -gdb_expect { - -re ".*$gdb_prompt $"\ - {pass "step over breakpoint"} - timeout {fail "(timeout) step over breakpoint"} -} -send_gdb "clear 81\n" -gdb_expect { - -re "No breakpoint at 81..*$gdb_prompt $"\ - {pass "clear line has no breakpoint disallowed"} - -re "$gdb_prompt $"\ - {fail "clear line has no breakpoint disallowed"} - timeout {fail "(timeout) clear line has no breakpoint disallowed"} -} -send_gdb "clear\n" -gdb_expect { - -re "No breakpoint at this line..*$gdb_prompt $"\ - {pass "clear current line has no breakpoint disallowed"} - -re "$gdb_prompt $"\ - {fail "clear current line has no breakpoint disallowed"} - timeout {fail "(timeout) clear current line has no breakpoint disallowed"} -} +gdb_test "next" "marker1.*" "step over breakpoint" + +gdb_test "clear 81" "No breakpoint at 81.*" \ + "clear line has no breakpoint disallowed" + +gdb_test "clear" "No breakpoint at this line.*" \ + "clear current line has no breakpoint disallowed" # Verify that we can set and clear multiple breakpoints. # @@ -567,90 +583,50 @@ gdb_test "clear marker3" {Deleted breakpoints [0-9]+ [0-9]+.*} # Verify that a breakpoint can be set via a convenience variable. # -send_gdb "set \$foo=$bp_location11\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "set convenience variable \$foo to bp_location11"} - timeout {fail "(timeout) set convenience variable \$foo to bp_location11"} -} -send_gdb "break \$foo\n" -gdb_expect { - -re "Breakpoint (\[0-9\]*) at .*, line $bp_location11.*$gdb_prompt $"\ - {pass "set breakpoint via convenience variable"} - -re "$gdb_prompt $"\ - {fail "set breakpoint via convenience variable"} - timeout {fail "(timeout) set breakpoint via convenience variable"} -} +gdb_test_no_output "set \$foo=$bp_location11" \ + "set convenience variable \$foo to bp_location11" + +gdb_test "break \$foo" \ + "Breakpoint (\[0-9\]*) at .*, line $bp_location11.*" \ + "set breakpoint via convenience variable" # Verify that GDB responds gracefully to an attempt to set a # breakpoint via a convenience variable whose type is not integer. # -send_gdb "set \$foo=81.5\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "set convenience variable \$foo to 81.5"} - timeout {fail "(timeout) set convenience variable \$foo to 81.5"} -} -send_gdb "break \$foo\n" -gdb_expect { - -re "Convenience variables used in line specs must have integer values..*$gdb_prompt $"\ - {pass "set breakpoint via non-integer convenience variable disallowed"} - -re "$gdb_prompt $"\ - {fail "set breakpoint via non-integer convenience variable disallowed"} - timeout {fail "(timeout) set breakpoint via non-integer convenience variable disallowed"} -} +gdb_test_no_output "set \$foo=81.5" \ + "set convenience variable \$foo to 81.5" + +gdb_test "break \$foo" \ + "Convenience variables used in line specs must have integer values.*" \ + "set breakpoint via non-integer convenience variable disallowed" # Verify that we can set and trigger a breakpoint in a user-called function. # -send_gdb "break marker2\n" -gdb_expect { - -re "Breakpoint (\[0-9\]*) at .*, line ($bp_location8|$bp_location9).*$gdb_prompt $"\ - {pass "set breakpoint on to-be-called function"} - -re "$gdb_prompt $"\ - {fail "set breakpoint on to-be-called function"} - timeout {fail "(timeout) set breakpoint on to-be-called function"} -} -send_gdb "print marker2(99)\n" -gdb_expect { - -re "The program being debugged stopped while in a function called from GDB.\r\nWhen the function .marker2$proto. is done executing, GDB will silently\r\nstop .instead of continuing to evaluate the expression containing\r\nthe function call...*$gdb_prompt $"\ - {pass "hit breakpoint on called function"} - -re "$gdb_prompt $"\ - {fail "hit breakpoint on called function"} - timeout {fail "(timeout) hit breakpoint on called function"} -} +gdb_test "break marker2" \ + "Breakpoint (\[0-9\]*) at .*, line $bp_location8.*" \ + "set breakpoint on to-be-called function" + +gdb_test "print marker2(99)" \ + "The program being debugged stopped while in a function called from GDB.\r\nEvaluation of the expression containing the function\r\n.marker2. will be abandoned.\r\nWhen the function is done executing, GDB will silently stop.*" \ + "hit breakpoint on called function" # As long as we're stopped (breakpointed) in a called function, # verify that we can successfully backtrace & such from here. -# -# In this and the following test, the _sr4export check apparently is needed -# for hppa*-*-hpux. -# -send_gdb "bt\n" -gdb_expect { - -re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9)\r\n#1.*_sr4export.*$gdb_prompt $"\ - {pass "backtrace while in called function"} - -re "#0\[ \t\]*($hex in )?marker2.*:($bp_location8|$bp_location9)\r\n#1.*function called from gdb.*$gdb_prompt $"\ - {pass "backtrace while in called function"} - -re "$gdb_prompt $"\ - {fail "backtrace while in called function"} - timeout {fail "(timeout) backtrace while in called function"} -} +gdb_test "bt" \ + "#0\[ \t\]*($hex in )?marker2.*:$bp_location8\r\n#1\[ \t\]*.*" \ + "backtrace while in called function" # Return from the called function. For remote targets, it's important to do # this before runto_main, which otherwise may silently stop on the dummy # breakpoint inserted by GDB at the program's entry point. # -send_gdb "finish\n" -gdb_expect { - -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.* in _sr4export.*$gdb_prompt $"\ - {pass "finish from called function"} - -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.*function called from gdb.*$gdb_prompt $"\ - {pass "finish from called function"} - -re "Run till exit from .*marker2.* at .*($bp_location8|$bp_location9)\r\n.*Value returned.*$gdb_prompt $"\ - {pass "finish from called function"} - -re "$gdb_prompt $"\ - {fail "finish from called function"} - timeout {fail "(timeout) finish from called function"} +gdb_test_multiple "finish" "finish from called function" { + -re "Run till exit from .*marker2.* at .*$bp_location8\r\n.*function called from gdb.*$gdb_prompt $" { + pass "finish from called function" + } + -re "Run till exit from .*marker2.* at .*$bp_location8\r\n.*Value returned.*$gdb_prompt $" { + pass "finish from called function" + } } # Verify that GDB responds gracefully to a "finish" command with @@ -673,79 +649,13 @@ gdb_expect { # second condition. # -send_gdb "finish\n" -gdb_expect { - -re "\"finish\" not meaningful in the outermost frame.\r\n$gdb_prompt $"\ - {pass "finish from outermost frame disallowed"} - -re "Run till exit from.*\r\n$gdb_prompt $" { - pass "finish from outermost frame disallowed" - } - -re "$gdb_prompt $"\ - {fail "finish from outermost frame disallowed"} - timeout {fail "(timeout) finish from outermost frame disallowed"} -} - -# Verify that we can explicitly ask GDB to stop on all shared library -# events, and that it does so. -# -if [istarget "hppa*-*-hpux*"] then { - if ![runto_main] then { fail "break tests suppressed" } - - send_gdb "set stop-on-solib-events 1\n" - gdb_expect { - -re "$gdb_prompt $"\ - {pass "set stop-on-solib-events"} - timeout {fail "(timeout) set stop-on-solib-events"} - } - - send_gdb "run\n" - gdb_expect { - -re ".*Start it from the beginning.*y or n. $"\ - {send_gdb "y\n" - gdb_expect { - -re ".*Stopped due to shared library event.*$gdb_prompt $"\ - {pass "triggered stop-on-solib-events"} - -re "$gdb_prompt $"\ - {fail "triggered stop-on-solib-events"} - timeout {fail "(timeout) triggered stop-on-solib-events"} - } - } - -re "$gdb_prompt $"\ - {fail "rerun for stop-on-solib-events"} - timeout {fail "(timeout) rerun for stop-on-solib-events"} - } - - send_gdb "set stop-on-solib-events 0\n" - gdb_expect { - -re "$gdb_prompt $"\ - {pass "reset stop-on-solib-events"} - timeout {fail "(timeout) reset stop-on-solib-events"} - } -} - -# Hardware breakpoints are unsupported on HP-UX. Verify that GDB -# gracefully responds to requests to create them. -# -if [istarget "hppa*-*-hpux*"] then { - if ![runto_main] then { fail "break tests suppressed" } - - send_gdb "hbreak\n" - gdb_expect { - -re "No hardware breakpoint support in the target.*$gdb_prompt $"\ - {pass "hw breaks disallowed"} - -re "$gdb_prompt $"\ - {fail "hw breaks disallowed"} - timeout {fail "(timeout) hw breaks disallowed"} - } - - send_gdb "thbreak\n" - gdb_expect { - -re "No hardware breakpoint support in the target.*$gdb_prompt $"\ - {pass "temporary hw breaks disallowed"} - -re "$gdb_prompt $"\ - {fail "temporary hw breaks disallowed"} - timeout {fail "(timeout) temporary hw breaks disallowed"} - } +gdb_test_multiple "finish" "finish from outermost frame disallowed" { + -re "\"finish\" not meaningful in the outermost frame.\r\n$gdb_prompt $" { + pass "finish from outermost frame disallowed" + } + -re "Run till exit from.*\r\n$gdb_prompt $" { + pass "finish from outermost frame disallowed" + } } #******** @@ -760,34 +670,15 @@ proc test_next_with_recursion {} { 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_expect { - -re "Break.* factorial .value=6. .*$gdb_prompt $" {} - -re ".*$gdb_prompt $" { - fail "run to factorial(6)"; - gdb_suppress_tests; - } - timeout { fail "run to factorial(6) (timeout)" ; gdb_suppress_tests } - } + gdb_run_cmd + gdb_test "" "Break.* factorial .value=6. .*" "run to factorial(6)" # Continue until we call factorial recursively with 5. @@ -845,7 +736,7 @@ proc test_next_with_recursion {} { if [target_info exists gdb,noresults] { gdb_suppress_tests } gdb_continue_to_end "recursive next test" - gdb_stop_suppressing_tests; + gdb_stop_suppressing_tests } test_next_with_recursion @@ -856,38 +747,15 @@ test_next_with_recursion # build a new file with optimization enabled so that we can try breakpoints # on targets with optimized prologues -set binfileo2 ${objdir}/${subdir}/${testfile}o2 - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}O0.o" object {debug nowarnings optimize=-O2}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}O1.o" object {debug nowarnings optimize=-O2}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if { [gdb_compile "${binfile}O0.o ${binfile}O1.o" "${binfileo2}" executable {debug nowarnings}] != "" } { - gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." -} - -if [get_compiler_info ${binfileo2}] { +if { [prepare_for_testing break.exp "breako2" {break.c break1.c} {debug nowarnings optimize=-O2}] } { return -1 } -gdb_exit -gdb_start -gdb_reinitialize_dir $srcdir/$subdir -gdb_load ${binfileo2} - -if [target_info exists gdb_stub] { - gdb_step_for_stub; -} - # # test break at function # gdb_test "break main" \ - "Breakpoint.*at.* file .*$srcfile, line.*" \ + "Breakpoint.*at.* file .*, line.*" \ "breakpoint function, optimized file" # @@ -900,29 +768,15 @@ gdb_test "break marker4" \ # # 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 + +set test "run until function breakpoint, optimized file" +gdb_test_multiple "" $test { + -re "Breakpoint \[0-9\]+,.*main .*argc.*argv.* at .*$srcfile:$bp_location6.*$bp_location6\[\t \]+if .argc.* \{.*$gdb_prompt $" { + pass $test } - -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 "$test (code motion)" } } @@ -939,33 +793,64 @@ if ![target_info exists use_gdb_stub] { # has no exactly matching line symbol, and GDB reports the breakpoint # as if it were in the middle of a line rather than at the beginning. -set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile1] set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile1] -send_gdb "continue\n" -gdb_expect { - -re "Breakpoint $decimal, marker4 \\(d=177601976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t \]+void marker4.*" { - pass "run until breakpoint set at small function, optimized file" - } - -re "Breakpoint $decimal, $hex in marker4 \\(d=177601976\\) at .*$srcfile1:$bp_location13\[\r\n\]+$bp_location13\[\t \]+void marker4.*" { - pass "run until breakpoint set at small function, optimized file" - } - -re "Breakpoint $decimal, marker4 \\(d=177601976\\) at .*$srcfile1:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void marker4.*" { - # marker4() is defined at line 46 when compiled with -DPROTOTYPES - pass "run until breakpoint set at small function, optimized file (line bp_location14)" + +gdb_test_multiple "continue" \ + "run until breakpoint set at small function, optimized file" { + -re "Breakpoint $decimal, marker4 \\(d=(d@entry=)?177601976\\) at .*$srcfile1:$bp_location14\[\r\n\]+$bp_location14\[\t \]+void marker4.*" { + pass "run until breakpoint set at small function, optimized file (line bp_location14)" + } + -re "Breakpoint $decimal, factorial \\(.*\\) .*\{\r\n$gdb_prompt" { + # GCC 4.3 emits bad line number information - see gcc/36748. + if { [test_compiler_info "gcc-4-3-*"] } { + setup_xfail *-*-* + } + fail "run until breakpoint set at small function, optimized file" + } } - -re ".*$gdb_prompt " { - fail "run until breakpoint set at small function, optimized file" + +clean_restart breako2 + +# +# test that 'rbreak' on a symbol that may be from a shared library doesn't +# cause a "Junk at end of arguments." error. +# +# On x86 GNU/Linux, this test will choke on e.g. __libc_start_main@plt. +# +# Note that this test won't necessarily choke on all targets even if +# all the rbreak issue is present. rbreak needs to match and set a +# breakpoint on a symbol causes 'break' to choke. +# + +gdb_test_no_output "set breakpoint pending on" "rbreak junk pending setup" + +# We expect at least one breakpoint to be set when we "rbreak main". +gdb_test "rbreak main" \ + ".*Breakpoint.*at.* file .*$srcfile, line.*" \ + "rbreak junk set breakpoint" + +# Run to a breakpoint. Fail if we see "Junk at end of arguments". +gdb_run_cmd + +set test "rbreak junk" +gdb_test_multiple "" $test { + -re "Junk at end of arguments" { + fail $test } - timeout { - fail "run until breakpoint set at small function, optimized file (timeout)" + -re ".*Breakpoint \[0-9\]+,.*$gdb_prompt $" { + pass $test } } +# +# Test break via convenience variable with file name +# +set line [gdb_get_line_number "set breakpoint 1 here"] +gdb_test_no_output "set \$l = $line" +gdb_breakpoint ${srcfile}:\$l -# Reset the default arguments for VxWorks -if [istarget "*-*-vxworks*"] { - set timeout 10 - verbose "Timeout is now $timeout seconds" 2 - send_gdb "set args main\n" - gdb_expect -re ".*$gdb_prompt $" {} -} +gdb_test_no_output "set \$foo=81.5" \ + "set convenience variable \$foo to 81.5" +gdb_test "break $srcfile:\$foo" \ + "Convenience variables used in line specs must have integer values.*" \ + "set breakpoint via non-integer convenience variable disallowed"