mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
460 lines
13 KiB
Plaintext
460 lines
13 KiB
Plaintext
# This testcase is part of GDB, the GNU debugger.
|
|
|
|
# Copyright 1997-2022 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 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
# test running programs
|
|
#
|
|
|
|
standard_testfile break.c break1.c
|
|
|
|
if {[prepare_for_testing "failed to prepare" ${testfile} \
|
|
[list $srcfile $srcfile2] {debug nowarnings}]} {
|
|
return -1
|
|
}
|
|
|
|
set bp_location1 [gdb_get_line_number "set breakpoint 1 here"]
|
|
set bp_location7 [gdb_get_line_number "set breakpoint 7 here"]
|
|
set bp_location8 [gdb_get_line_number "set breakpoint 8 here" $srcfile2]
|
|
set bp_location11 [gdb_get_line_number "set breakpoint 11 here"]
|
|
set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile2]
|
|
set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile2]
|
|
set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile2]
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
# Verify that we can set a breakpoint (the location is irrelevant),
|
|
# then enable it (yes, it's already enabled by default), then hit it.
|
|
|
|
proc break_at { breakpoint where } {
|
|
global gdb_prompt
|
|
global expect_out
|
|
|
|
set test "break $breakpoint"
|
|
set bp 0
|
|
gdb_test_multiple "$test" "$test" {
|
|
-re "Breakpoint (\[0-9\]*) at .*$where.*$gdb_prompt $" {
|
|
set bp $expect_out(1,string)
|
|
pass $gdb_test_name
|
|
}
|
|
}
|
|
return $bp
|
|
}
|
|
|
|
set bp [break_at "marker1" " line $bp_location15"]
|
|
|
|
gdb_test_no_output "enable $bp" "enable break marker1"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*" \
|
|
"info break marker1 before hitting breakpoint"
|
|
|
|
# See the comments in condbreak.exp for "run until breakpoint at
|
|
# marker1" for an explanation of the xfail below.
|
|
set test "continue to break marker1"
|
|
gdb_test_multiple "continue" "$test" {
|
|
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" {
|
|
pass "$test"
|
|
}
|
|
-re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" {
|
|
xfail "$test"
|
|
}
|
|
}
|
|
|
|
gdb_test_no_output "delete $bp" "delete break marker1"
|
|
|
|
# Verify that we can set a breakpoint to be self-disabling after the
|
|
# first time it triggers.
|
|
set bp [break_at "marker2" " line $bp_location8"]
|
|
|
|
gdb_test_no_output "enable once $bp" "enable once break marker2"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+y.*" \
|
|
"info auto-disabled break marker2 before hitting breakpoint"
|
|
|
|
# See the comments in condbreak.exp for "run until breakpoint at
|
|
# marker1" for an explanation of the xfail below.
|
|
set test "continue to auto-disabled break marker2"
|
|
gdb_test_multiple "continue" "$test" {
|
|
-re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $" {
|
|
pass "$test"
|
|
}
|
|
-re "Breakpoint \[0-9\]*, $hex in marker2.*$gdb_prompt $" {
|
|
xfail "$test"
|
|
}
|
|
}
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+dis\[ \t\]+n.*" \
|
|
"info auto-disabled break marker2 after hitting breakpoint"
|
|
|
|
# Verify that we don't stop at a disabled breakpoint.
|
|
gdb_continue_to_end "no stop"
|
|
|
|
set count 1
|
|
with_test_prefix "run $count" {
|
|
rerun_to_main
|
|
incr count
|
|
}
|
|
gdb_continue_to_end "no stop at auto-disabled break marker2"
|
|
|
|
# Verify that we can set a breakpoint to be self-deleting after the
|
|
# first time it triggers.
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
set bp [break_at "marker3" " line $bp_location17"]
|
|
|
|
gdb_test_no_output "enable del $bp" "enable del break marker3"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*" \
|
|
"info auto-deleted break marker2"
|
|
|
|
gdb_test "continue" \
|
|
".*marker3 .*:$bp_location17.*" \
|
|
"continue to auto-deleted break marker3"
|
|
|
|
gdb_test "info break $bp" \
|
|
".*No breakpoint or watchpoint matching.*" \
|
|
"info auto-deleted break marker3"
|
|
|
|
# Verify that we can set a breakpoint and manually disable it (we've
|
|
# already proven that disabled bp's don't trigger).
|
|
|
|
set bp [break_at "marker4" " line $bp_location14.*"]
|
|
|
|
gdb_test_no_output "disable $bp" "disable break marker4"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*" \
|
|
"info break marker4"
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
# Test enable count by stopping at a location until it is disabled
|
|
# and passes through.
|
|
|
|
set bp [break_at $bp_location7 "line $bp_location7"]
|
|
|
|
with_test_prefix "enable count" {
|
|
set bp2 [break_at marker1 " line $bp_location15"]
|
|
}
|
|
|
|
gdb_test "enable count" \
|
|
"Argument required \\(hit count\\)\\." \
|
|
"enable count missing arguments"
|
|
|
|
gdb_test "enable count 2" \
|
|
"Argument required \\(one or more breakpoint numbers\\)\\." \
|
|
"enable count missing breakpoint number"
|
|
|
|
gdb_test_no_output "enable count 2 $bp" "disable break with count"
|
|
|
|
gdb_test "continue" \
|
|
".*factorial .*:$bp_location7.*" \
|
|
"continue from enable count, first time"
|
|
|
|
gdb_test "continue" \
|
|
".*factorial .*:$bp_location7.*" \
|
|
"continue from enable count, second time"
|
|
|
|
gdb_test "continue" \
|
|
".*marker1 .*:$bp_location15.*" \
|
|
"continue through enable count, now disabled"
|
|
|
|
# Verify that we can set a breakpoint with an ignore count N, which
|
|
# should cause the next N triggers of the bp to be ignored. (This is
|
|
# a flavor of enablement/disablement, after all.)
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
with_test_prefix "ignore count" {
|
|
set bp [break_at "marker1" " line $bp_location15.*"]
|
|
}
|
|
|
|
# Verify that an ignore of a non-existent breakpoint is gracefully
|
|
# handled.
|
|
|
|
gdb_test "ignore 999 2" \
|
|
"No breakpoint number 999..*" \
|
|
"ignore non-existent break"
|
|
|
|
# Verify that a missing ignore count is gracefully handled.
|
|
|
|
gdb_test "ignore $bp" \
|
|
"Second argument .specified ignore-count. is missing..*" \
|
|
"ignore break with missing ignore count"
|
|
|
|
# Verify that a negative or zero ignore count is handled gracefully
|
|
# (they both are treated the same).
|
|
|
|
gdb_test "ignore $bp -1" \
|
|
"Will stop next time breakpoint \[0-9\]* is reached..*" \
|
|
"ignore break marker1 -1"
|
|
|
|
gdb_test "ignore $bp 0" \
|
|
"Will stop next time breakpoint \[0-9\]* is reached..*" \
|
|
"ignore break marker1 0"
|
|
|
|
gdb_test "ignore $bp 1" \
|
|
"Will ignore next crossing of breakpoint \[0-9\]*.*" \
|
|
"ignore break marker1 1"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+y.*ignore next 1 hits.*" \
|
|
"info ignored break marker1"
|
|
|
|
gdb_continue_to_end "no stop at ignored break marker1"
|
|
|
|
with_test_prefix "run $count" {
|
|
rerun_to_main
|
|
incr count
|
|
}
|
|
|
|
# See the comments in condbreak.exp for "run until breakpoint at marker1"
|
|
# for an explanation of the xfail below.
|
|
set test "continue to break marker1, 2nd time"
|
|
gdb_test_multiple "continue" "$test" {
|
|
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $" {
|
|
pass "continue to break marker1, 2nd time"
|
|
}
|
|
-re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $" {
|
|
xfail "continue to break marker1, 2nd time"
|
|
}
|
|
}
|
|
|
|
# Verify that we can specify both an ignore count and an auto-delete.
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
with_test_prefix "ignore count and auto-delete" {
|
|
set bp [break_at marker1 " line $bp_location15.*"]
|
|
}
|
|
|
|
gdb_test "ignore $bp 1" \
|
|
"Will ignore next crossing of breakpoint \[0-9\]*.*" \
|
|
"ignore break marker1"
|
|
|
|
gdb_test_no_output "enable del $bp" "enable del break marker1"
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+del\[ \t\]+y.*ignore next 1 hits.*" \
|
|
"info break marker1 after hitting breakpoint"
|
|
|
|
gdb_continue_to_end "no stop at ignored & auto-deleted break marker1"
|
|
|
|
with_test_prefix "run $count" {
|
|
rerun_to_main
|
|
incr count
|
|
}
|
|
|
|
gdb_test "continue" \
|
|
".*marker1 .*:$bp_location15.*" \
|
|
"continue to ignored & auto-deleted break marker1"
|
|
|
|
# Verify that a disabled breakpoint's ignore count isn't updated when
|
|
# the bp is encountered.
|
|
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
with_test_prefix "disabled breakpoint ignore count" {
|
|
set bp [break_at marker1 " line $bp_location15"]
|
|
}
|
|
|
|
gdb_test "ignore $bp 10" \
|
|
"Will ignore next 10 crossings of breakpoint \[0-9\]*.*" \
|
|
"ignore break marker1 10"
|
|
|
|
gdb_test_no_output "disable $bp" "disable break marker1"
|
|
|
|
gdb_continue_to_end "no stop at ignored & disabled break marker1"
|
|
|
|
with_test_prefix "run $count" {
|
|
rerun_to_main
|
|
}
|
|
|
|
gdb_test "info break $bp" \
|
|
"\[0-9\]*\[ \t\]+breakpoint\[ \t\]+keep\[ \t\]+n.*ignore next 10 hits.*" \
|
|
"info ignored & disabled break marker1"
|
|
|
|
# Verify that GDB correctly handles the "continue" command with an argument,
|
|
# which is an ignore count to set on the currently stopped-at breakpoint.
|
|
# (Also verify that GDB gracefully handles the case where the inferior
|
|
# isn't stopped at a breakpoint.)
|
|
#
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
gdb_test "break $bp_location1" \
|
|
"Breakpoint \[0-9\]*.*, line $bp_location1.*" \
|
|
"prepare to continue with ignore count"
|
|
|
|
gdb_test "continue 2" \
|
|
"Will ignore next crossing of breakpoint \[0-9\]*. Continuing..*" \
|
|
"continue with ignore count"
|
|
|
|
gdb_test "next" ".*$bp_location11\[ \t\]*marker1.*" \
|
|
"step after continue with ignore count"
|
|
|
|
set test "continue with ignore count, not stopped at bpt"
|
|
gdb_test_multiple "continue 2" "$test" {
|
|
-re "Not stopped at any breakpoint; argument ignored.*$gdb_prompt $" {
|
|
pass "$test"
|
|
}
|
|
-re "No breakpoint number -1.*$gdb_prompt $" {
|
|
kfail gdb/1689 "$test"
|
|
}
|
|
}
|
|
|
|
# Verify that GDB correctly handles the "enable/disable" command
|
|
# with arguments, that include multiple locations.
|
|
#
|
|
if ![runto_main] then {
|
|
return
|
|
}
|
|
|
|
set b1 0
|
|
set b2 0
|
|
set b3 0
|
|
set b4 0
|
|
set b1 [break_at main ""]
|
|
|
|
with_test_prefix "2nd breakpoint" {
|
|
set b2 [break_at main ""]
|
|
}
|
|
|
|
with_test_prefix "3rd breakpoint" {
|
|
set b3 [break_at main ""]
|
|
}
|
|
|
|
with_test_prefix "4th breakpoint" {
|
|
set b4 [break_at main ""]
|
|
}
|
|
|
|
# Perform tests for disable/enable commands on multiple
|
|
# locations and breakpoints.
|
|
#
|
|
# WHAT - the command to test (disable/enable).
|
|
#
|
|
# Note: tests involving location ranges (and more) are found in
|
|
# gdb.cp/ena-dis-br-range.exp.
|
|
#
|
|
proc test_ena_dis_br { what } {
|
|
global b1
|
|
global b2
|
|
global b3
|
|
global b4
|
|
global gdb_prompt
|
|
|
|
# OPPOS - the command opposite to WHAT.
|
|
# WHAT_RES - whether breakpoints are expected to end
|
|
# up enabled or disabled.
|
|
# OPPOS_RES- same as WHAT_RES but opposite.
|
|
# P1/P2 - proc to call (pass/fail). Must be
|
|
# opposites.
|
|
# Set variable values for disable command.
|
|
set oppos "enable"
|
|
set oppos_res "y"
|
|
set what_res "n"
|
|
set p1 "pass"
|
|
set p2 "fail"
|
|
|
|
if { "$what" == "enable" } {
|
|
# Set varibale values for enable command.
|
|
set oppos "disable"
|
|
set oppos_res "n"
|
|
set what_res "y"
|
|
set p1 "fail"
|
|
set p2 "pass"
|
|
}
|
|
|
|
# Now enable(disable) $b.1 $b2.1.
|
|
gdb_test_no_output "$what $b1.1 $b2.1" "$what \$b1.1 \$b2.1"
|
|
set test1 "${what}d \$b1.1 and \$b2.1"
|
|
|
|
# Now $b1.1 and $b2.1 should be enabled(disabled).
|
|
gdb_test_multiple "info break" "$test1" {
|
|
-re "(${b1}.1)(\[^\n\r\]*)( n.*)(${b2}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" {
|
|
$p1 "$test1"
|
|
}
|
|
-re ".*$gdb_prompt $" {
|
|
$p2 "$test1"
|
|
}
|
|
}
|
|
|
|
# Now enable(disable) $b1 fooo.1, it should give error on fooo.
|
|
gdb_test "$what $b1 fooo.1" \
|
|
"Bad breakpoint number 'fooo\\.1'" \
|
|
"$what \$b1 fooo.1"
|
|
|
|
# $b1 should be enabled(disabled).
|
|
gdb_test "info break" \
|
|
"(${b1})(\[^\n\r]*)( $what_res.*)" \
|
|
"${what}d \$b1"
|
|
|
|
gdb_test_no_output "$oppos $b3" "$oppos \$b3"
|
|
gdb_test_no_output "$what $b4 $b3.1" "$what \$b4 \$b3.1"
|
|
set test1 "${what}d \$b4 and \$b3.1,remain ${oppos}d \$b3"
|
|
|
|
# Now $b4 $b3.1 should be enabled(disabled) and
|
|
# $b3 should remain disabled(enabled).
|
|
gdb_test_multiple "info break" "$test1" {
|
|
-re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b3}.1)(\[^\n\r\]*)( n.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" {
|
|
$p1 "$test1"
|
|
}
|
|
-re "(${b3})(\[^\n\r]*)( $oppos_res.*)(${b4})(\[^\n\r\]*)( $what_res.*)$gdb_prompt $" {
|
|
$p2 "$test1"
|
|
}
|
|
}
|
|
|
|
# Now enable(disable) '$b4.1 fooobaar'. This should error on
|
|
# fooobaar.
|
|
gdb_test "$what $b4.1 fooobaar" \
|
|
"Bad breakpoint number 'fooobaar'" \
|
|
"$what \$b4.1 fooobar"
|
|
set test1 "${what}d \$b4.1"
|
|
|
|
# $b4.1 should be enabled(disabled).
|
|
gdb_test_multiple "info break" "$test1" {
|
|
-re "(${b4}.1)(\[^\n\r\]*)( n.*)$gdb_prompt $" {
|
|
$p1 "$test1"
|
|
}
|
|
-re ".*$gdb_prompt $" {
|
|
$p2 "$test1"
|
|
}
|
|
}
|
|
}
|
|
|
|
test_ena_dis_br "disable"
|
|
test_ena_dis_br "enable"
|
|
|
|
gdb_exit
|
|
return 0
|