# Copyright 2018-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 . # This testcase is a regression test for a regression in the in-line # step-over machinery. If a resumption that starts a step-over # failed, a following resumption would make GDB hang forever: # # (gdb) b *0 # Breakpoint 2 at 0x0 # continue # Continuing. # Warning: # Cannot insert breakpoint 2. # Cannot access memory at address 0x0 # # Command aborted. # delete breakpoints # Delete all breakpoints? (y or n) y # (gdb) b function # Breakpoint 3 at 0x40048b: file test.c, line 33. # continue # Continuing. # *GDB hangs forever* standard_testfile if {[build_executable "failed to prepare" $testfile $srcfile debug]} { return -1 } # DISPLACED indicates whether to use displaced-stepping. proc do_test {displaced breakpoint_always_inserted} { global gdb_prompt decimal global srcfile binfile clean_restart $binfile gdb_test_no_output "set displaced-stepping $displaced" gdb_test_no_output "set breakpoint always-inserted $breakpoint_always_inserted" if ![runto_main] { fail "run to main" return -1 } # We rely on not being able to set a breakpoint at 0, as proxy for # any kind of breakpoint insertion failure. If we can examine # what's at memory address 0, it is possible that we could also # execute it. if [is_address_zero_readable] { untested "memory at address 0 is possibly executable" return } # Set a breakpoint that fails to insert. if { $breakpoint_always_inserted == "on" } { gdb_test "b *0" "Breakpoint $decimal at 0x0.*" } else { gdb_test "b *0" "Breakpoint $decimal at 0x0" } gdb_test "continue" \ "Command aborted\\." \ "continue aborts" # Delete the "bad" breakpoint and try continuing again. delete_breakpoints gdb_test "b function" "Breakpoint $decimal .*$srcfile.*" gdb_test "continue" \ "Breakpoint $decimal, function \\(\\) at .*$srcfile:.*" \ "continue to function" } # This testcase exercises a regression with the in-line step-over # machinery. So make sure this runs with displaced stepping disabled, # and for good measure, also try with displaced stepping enabled. foreach_with_prefix displaced-stepping {"off" "on"} { foreach_with_prefix breakpoint-always-inserted {"off" "on"} { do_test ${displaced-stepping} ${breakpoint-always-inserted} } }