diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 55b4a31af1..df4ecb8b37 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-12 Pedro Alves + + * gdb.base/continue-after-aborted-step-over.c: New. + * gdb.base/continue-after-aborted-step-over.exp: New. + 2018-01-11 Simon Marchi * lib/gdb.exp (gdb_compile): Ignore shlib= and shlib_load diff --git a/gdb/testsuite/gdb.base/continue-after-aborted-step-over.c b/gdb/testsuite/gdb.base/continue-after-aborted-step-over.c new file mode 100644 index 0000000000..7252648084 --- /dev/null +++ b/gdb/testsuite/gdb.base/continue-after-aborted-step-over.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2018 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 . */ + +void +function (void) +{ +} + +int +main () +{ + function (); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/continue-after-aborted-step-over.exp b/gdb/testsuite/gdb.base/continue-after-aborted-step-over.exp new file mode 100644 index 0000000000..297cb63858 --- /dev/null +++ b/gdb/testsuite/gdb.base/continue-after-aborted-step-over.exp @@ -0,0 +1,87 @@ +# Copyright 2018 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} { + global gdb_prompt decimal + global srcfile binfile + + clean_restart $binfile + + gdb_test_no_output "set displaced-stepping $displaced" + + 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. + 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"} { + do_test ${displaced-stepping} +}