| # 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 <http://www.gnu.org/licenses/>. |
| |
| # 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]} { |
| 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]} { |
| 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]} { |
| 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 |
| } |