# Copyright 2020-2021 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 . # Test defining bad conditions for breakpoints. standard_testfile if {[prepare_for_testing "failed to prepare" ${binfile} ${srcfile}]} { return } set bp_location [gdb_get_line_number "break-here"] gdb_breakpoint "$bp_location" set bpnum [get_integer_valueof "\$bpnum" 0 "get bpnum"] # Define a 'bad' condition. The breakpoint should stay unconditional. gdb_test "cond $bpnum gibberish" \ "No symbol \"gibberish\" in current context." \ "attempt a bad condition" set fill "\[^\r\n\]*" gdb_test "info break" \ [multi_line \ "Num${fill}What" \ "${decimal}${fill}breakpoint${fill}keep y${fill}:${bp_location}"] \ "breakpoint is unconditional" # Now define a valid condition. Attempt to override that with a 'bad' # condition again. The condition should be preserved. with_test_prefix "with run" { gdb_test_no_output "cond $bpnum a == 10" gdb_test "cond $bpnum gibberish" \ "No symbol \"gibberish\" in current context." \ "attempt a bad condition" gdb_test "info break" \ [multi_line \ "Num${fill}What" \ "${decimal}${fill}breakpoint${fill}keep y${fill}:${bp_location}" \ "${fill}stop only if a == 10${fill}"] \ "breakpoint condition is preserved" # Run the code. We should hit the breakpoint, because the # condition evaluates to true. gdb_run_cmd gdb_test "" ".*reakpoint .*, main .*${srcfile}.*" "run to the bp" } # Restart. Repeat the test above after the program has started. # This is needed to check a scenario where the breakpoints are no # longer re-inserted due to solib events. Note that runto_main # deletes the breakpoints. with_test_prefix "with continue 1" { if {![runto_main]} { fail "could not run to main" return -1 } gdb_breakpoint "$bp_location" set bpnum [get_integer_valueof "\$bpnum" 0 "get bpnum"] gdb_test_no_output "cond $bpnum a == 10" gdb_test "cond $bpnum gibberish" \ "No symbol \"gibberish\" in current context." \ "attempt a bad condition" # Resume. We should hit the breakpoint, because the # condition evaluates to true. gdb_continue_to_breakpoint "${srcfile}:${bp_location}" } # Repeat with a condition that evaluates to false. with_test_prefix "with continue 2" { if {![runto_main]} { fail "could not run to main" return -1 } gdb_breakpoint "$bp_location" set bpnum [get_integer_valueof "\$bpnum" 0 "get bpnum"] gdb_test_no_output "cond $bpnum a == 999" gdb_test "cond $bpnum gibberish" \ "No symbol \"gibberish\" in current context." \ "attempt a bad condition" # Resume. We should *not* hit the breakpoint, because the # condition evaluates to false. gdb_continue_to_end } # Repeat with a condition that contains junk at the end. with_test_prefix "with junk" { if {![runto_main]} { fail "could not run to main" return -1 } gdb_breakpoint "$bp_location" set bpnum [get_integer_valueof "\$bpnum" 0 "get bpnum"] gdb_test_no_output "cond $bpnum a == 999" gdb_test "cond $bpnum a == 10 if" \ "Junk at end of expression" \ "attempt a bad condition" # Resume. We should *not* hit the breakpoint, because the # condition evaluates to false. gdb_continue_to_end }