1# This testcase is part of GDB, the GNU debugger. 2 3# Copyright 1997, 1998, 1999, 2003, 2004, 2007, 2008, 2009, 2010, 2011 4# Free Software Foundation, Inc. 5 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 3 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program. If not, see <http://www.gnu.org/licenses/>. 18 19if $tracelevel then { 20 strace $tracelevel 21} 22 23global usestubs 24 25# 26# test running programs 27# 28 29set testfile "break" 30set srcfile ${testfile}.c 31set srcfile1 ${testfile}1.c 32set binfile ${objdir}/${subdir}/${testfile} 33 34if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object {debug nowarnings}] != "" } { 35 untested ena-dis-br.exp 36 return -1 37} 38 39if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object {debug nowarnings}] != "" } { 40 untested ena-dis-br.exp 41 return -1 42} 43 44if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug nowarnings}] != "" } { 45 untested ena-dis-br.exp 46 return -1 47} 48 49gdb_exit 50gdb_start 51gdb_reinitialize_dir $srcdir/$subdir 52gdb_load ${binfile} 53 54set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] 55set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile1] 56set bp_location9 [gdb_get_line_number "set breakpoint 9 here" $srcfile1] 57set bp_location11 [gdb_get_line_number "set breakpoint 11 here"] 58set bp_location13 [gdb_get_line_number "set breakpoint 13 here" $srcfile1] 59set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile1] 60set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile1] 61set bp_location16 [gdb_get_line_number "set breakpoint 16 here" $srcfile1] 62set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile1] 63set bp_location18 [gdb_get_line_number "set breakpoint 18 here" $srcfile1] 64 65if ![runto_main] then { fail "enable/disable break tests suppressed" } 66 67# Verify that we can set a breakpoint (the location is irrelevant), 68# then enable it (yes, it's already enabled by default), then hit it. 69 70proc break_at { breakpoint where } { 71 global gdb_prompt 72 global expect_out 73 74 set test "break $breakpoint" 75 set bp 0 76 gdb_test_multiple "$test" "$test" { 77 -re "Breakpoint (\[0-9\]*) at .*$where.*$gdb_prompt $" { 78 set bp $expect_out(1,string) 79 pass "$test" 80 } 81 } 82 return $bp 83} 84 85set bp [break_at "marker1" " line ($bp_location15|$bp_location16)"] 86 87gdb_test_no_output "enable $bp" "enable break marker1" 88 89gdb_test "info break $bp" \ 90 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*" \ 91 "info break marker1" 92 93# See the comments in condbreak.exp for "run until breakpoint at 94# marker1" for an explanation of the xfail below. 95set test "continue to break marker1" 96gdb_test_multiple "continue" "$test" { 97 -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" { 98 pass "$test" 99 } 100 -re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" { 101 xfail "$test" 102 } 103} 104 105gdb_test_no_output "delete $bp" "delete break marker1" 106 107# Verify that we can set a breakpoint to be self-disabling after the 108# first time it triggers. 109set bp [break_at "marker2" " line ($bp_location8|$bp_location9)"] 110 111gdb_test_no_output "enable once $bp" "enable once break marker2" 112 113gdb_test "info break $bp" \ 114 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+y.*" \ 115 "info auto-disabled break marker2" 116 117# See the comments in condbreak.exp for "run until breakpoint at 118# marker1" for an explanation of the xfail below. 119set test "continue to auto-disabled break marker2" 120gdb_test_multiple "continue" "$test" { 121 -re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $" { 122 pass "$test" 123 } 124 -re "Breakpoint \[0-9\]*, $hex in marker2.*$gdb_prompt $" { 125 xfail "$test" 126 } 127} 128 129gdb_test "info break $bp" \ 130 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+n.*" \ 131 "info auto-disabled break marker2" 132 133# Verify that we don't stop at a disabled breakpoint. 134gdb_continue_to_end "no stop" 135rerun_to_main 136gdb_continue_to_end "no stop at auto-disabled break marker2" 137 138# Verify that we can set a breakpoint to be self-deleting after the 139# first time it triggers. 140if ![runto_main] then { 141 fail "enable/disable break tests suppressed" 142} 143 144set bp [break_at "marker3" " line ($bp_location17|$bp_location18)"] 145 146gdb_test_no_output "enable del $bp" "enable del break marker3" 147 148gdb_test "info break $bp" \ 149 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*" \ 150 "info auto-deleted break marker2" 151 152gdb_test "continue" \ 153 ".*marker3 .*:($bp_location17|$bp_location18).*" \ 154 "continue to auto-deleted break marker3" 155 156gdb_test "info break $bp" \ 157 ".*No breakpoint or watchpoint matching.*" \ 158 "info auto-deleted break marker3" 159 160# Verify that we can set a breakpoint and manually disable it (we've 161# already proven that disabled bp's don't trigger). 162 163set bp [break_at "marker4" " line ($bp_location14|$bp_location13).*"] 164 165gdb_test_no_output "disable $bp" "disable break marker4" 166 167gdb_test "info break $bp" \ 168 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*" \ 169 "info break marker4" 170 171# Verify that we can set a breakpoint with an ignore count N, which 172# should cause the next N triggers of the bp to be ignored. (This is 173# a flavor of enablement/disablement, after all.) 174 175if ![runto_main] then { 176 fail "enable/disable break tests suppressed" 177} 178 179set bp [break_at "marker1" " line ($bp_location15|$bp_location16).*"] 180 181# Verify that an ignore of a non-existent breakpoint is gracefully 182# handled. 183 184gdb_test "ignore 999 2" \ 185 "No breakpoint number 999..*" \ 186 "ignore non-existent break" 187 188# Verify that a missing ignore count is gracefully handled. 189 190gdb_test "ignore $bp" \ 191 "Second argument .specified ignore-count. is missing..*" \ 192 "ignore break with missing ignore count" 193 194# Verify that a negative or zero ignore count is handled gracefully 195# (they both are treated the same). 196 197gdb_test "ignore $bp -1" \ 198 "Will stop next time breakpoint \[0-9\]* is reached..*" \ 199 "ignore break marker1 -1" 200 201gdb_test "ignore $bp 0" \ 202 "Will stop next time breakpoint \[0-9\]* is reached..*" \ 203 "ignore break marker1 0" 204 205gdb_test "ignore $bp 1" \ 206 "Will ignore next crossing of breakpoint \[0-9\]*.*" \ 207 "ignore break marker1" 208 209gdb_test "info break $bp" \ 210 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*ignore next 1 hits.*" \ 211 "info ignored break marker1" 212 213gdb_continue_to_end "no stop at ignored break marker1" 214rerun_to_main 215 216# See the comments in condbreak.exp for "run until breakpoint at marker1" 217# for an explanation of the xfail below. 218set test "continue to break marker1, 2nd time" 219gdb_test_multiple "continue" "$test" { 220 -re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" { 221 pass "continue to break marker1, 2nd time" 222 } 223 -re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" { 224 xfail "continue to break marker1, 2nd time" 225 } 226} 227 228# Verify that we can specify both an ignore count and an auto-delete. 229 230if ![runto_main] then { 231 fail "enable/disable break tests suppressed" 232} 233 234set bp [break_at marker1 " line ($bp_location15|$bp_location16).*"] 235 236gdb_test "ignore $bp 1" \ 237 "Will ignore next crossing of breakpoint \[0-9\]*.*" \ 238 "ignore break marker1" 239 240gdb_test_no_output "enable del $bp" "enable del break marker1" 241 242gdb_test "info break $bp" \ 243 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*ignore next 1 hits.*" \ 244 "info break marker1" 245 246gdb_continue_to_end "no stop at ignored & auto-deleted break marker1" 247rerun_to_main 248 249gdb_test "continue" \ 250 ".*marker1 .*:($bp_location15|$bp_location16).*" \ 251 "continue to ignored & auto-deleted break marker1" 252 253# Verify that a disabled breakpoint's ignore count isn't updated when 254# the bp is encountered. 255 256if ![runto_main] then { 257 fail "enable/disable break tests suppressed" 258} 259 260set bp [break_at marker1 " line ($bp_location15|$bp_location16)"] 261 262gdb_test "ignore $bp 10" \ 263 "Will ignore next 10 crossings of breakpoint \[0-9\]*.*" \ 264 "ignore break marker1" 265 266gdb_test_no_output "disable $bp" "disable break marker1" 267 268gdb_continue_to_end "no stop at ignored & disabled break marker1" 269rerun_to_main 270 271gdb_test "info break $bp" \ 272 "\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*ignore next 10 hits.*" \ 273 "info ignored & disabled break marker1" 274 275# Verify that GDB correctly handles the "continue" command with an argument, 276# which is an ignore count to set on the currently stopped-at breakpoint. 277# (Also verify that GDB gracefully handles the case where the inferior 278# isn't stopped at a breakpoint.) 279# 280if ![runto_main] then { fail "enable/disable break tests suppressed" } 281 282gdb_test "break $bp_location1" \ 283 "Breakpoint \[0-9\]*.*, line $bp_location1.*" \ 284 "prepare to continue with ignore count" 285 286gdb_test "continue 2" \ 287 "Will ignore next crossing of breakpoint \[0-9\]*. Continuing..*" \ 288 "continue with ignore count" 289 290gdb_test "next" ".*$bp_location11\[ \t\]*marker1.*" \ 291 step after continue with ignore count" 292 293set test "continue with ignore count, not stopped at bpt" 294gdb_test_multiple "continue 2" "$test" { 295 -re "Not stopped at any breakpoint; argument ignored.*$gdb_prompt $" { 296 pass "$test" 297 } 298 -re "No breakpoint number -1.*$gdb_prompt $" { 299 kfail gdb/1689 "$test" 300 } 301} 302 303gdb_exit 304return 0 305