diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/breakpoint.c | 14 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c | 28 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp | 120 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/hbreak-unmapped.c | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/hbreak-unmapped.exp | 72 | ||||
-rw-r--r-- | gdb/testsuite/gdb.trace/qtro.exp | 16 | ||||
-rw-r--r-- | gdb/testsuite/lib/gdb.exp | 19 |
10 files changed, 307 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6de9f69..4066217 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2014-04-23 Pedro Alves <palves@redhat.com> + + * breakpoint.c (insert_bp_location, remove_breakpoint_1): If + the breakpoint is set in a shared library, only suppress + errors for software breakpoints, not hardware breakpoints. + 2014-04-22 Pedro Alves <palves@redhat.com> * infrun.c (schedlock_applies): New function, factored out from diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f777a4a..19a7376 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2642,12 +2642,12 @@ insert_bp_location (struct bp_location *bl, breakpoint in a shared library that has already been removed, but we have not yet processed the shlib unload event. Unfortunately, some targets that implement - breakpoint insertion themselves (necessary if this is a - HW breakpoint, but SW breakpoints likewise) can't tell - why the breakpoint insertion failed (e.g., the remote - target doesn't define error codes), so we must treat - generic errors as memory errors. */ + breakpoint insertion themselves can't tell why the + breakpoint insertion failed (e.g., the remote target + doesn't define error codes), so we must treat generic + errors as memory errors. */ if ((bp_err == GENERIC_ERROR || bp_err == MEMORY_ERROR) + && bl->loc_type == bp_loc_software_breakpoint && solib_name_from_address (bl->pspace, bl->address)) { /* See also: disable_breakpoints_in_shlibs. */ @@ -3826,7 +3826,9 @@ remove_breakpoint_1 (struct bp_location *bl, insertion_state_t is) /* In some cases, we might not be able to remove a breakpoint in a shared library that has already been removed, but we have not yet processed the shlib unload event. */ - if (val && solib_name_from_address (bl->pspace, bl->address)) + if (val + && bl->loc_type == bp_loc_software_breakpoint + && solib_name_from_address (bl->pspace, bl->address)) val = 0; if (val) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2f42ad1..5502a08 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2014-04-23 Pedro Alves <palves@redhat.com> + + * gdb.base/hbreak-in-shr-unsupported-shr.c: New file. + * gdb.base/hbreak-in-shr-unsupported.c: New file. + * gdb.base/hbreak-in-shr-unsupported.exp: New file. + * gdb.base/hbreak-unmapped.c: New file. + * gdb.base/hbreak-unmapped.exp: New file. + * gdb.trace/qtro.exp (gdb_is_target_remote): Move ... + * lib/gdb.exp (gdb_is_target_remote): ... here. + 2014-04-22 Pedro Alves <palves@redhat.com> * gdb.base/consecutive-step-over.c: New file. diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c new file mode 100644 index 0000000..c48260e --- /dev/null +++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported-shr.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2004-2014 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/>. */ + +int +shrfunc (int x) +{ + return x * 10; +} diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c new file mode 100644 index 0000000..edf0687 --- /dev/null +++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.c @@ -0,0 +1,28 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2004-2014 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/>. */ + +extern int shrfunc (int x); + +int +main (void) +{ + int y; + + y = shrfunc (1); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp new file mode 100644 index 0000000..8623d13 --- /dev/null +++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp @@ -0,0 +1,120 @@ +# Copyright 2014 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 that trying to inserting a hw breakpoint in a shared library +# when the target doesn't support hw breakpoints doesn't silently +# error out without informing the user. + +if {[skip_shlib_tests]} { + return -1 +} + +set main_src hbreak-in-shr-unsupported.c +set lib_src hbreak-in-shr-unsupported-shr.c +standard_testfile ${main_src} ${lib_src} +set lib_basename hbreak-in-shr-unsupported-shr.so +set lib_so [standard_output_file ${lib_basename}] + +set lib_opts "debug" +set exec_opts [list debug shlib=${lib_so}] + +if [get_compiler_info] { + return -1 +} + +if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib_src} ${lib_so} $lib_opts] != "" + || [gdb_compile ${srcdir}/${subdir}/${main_src} ${binfile} executable $exec_opts] != ""} { + untested "Could not compile ${subdir}/$lib_src or ${subdir}/$srcfile." + return -1 +} + +clean_restart $binfile +gdb_load_shlibs $lib_so + +if ![runto_main] then { + fail "Can't run to main" + return -1 +} + +set is_target_remote [gdb_is_target_remote] + +# Get main breakpoint out of the way. +delete_breakpoints + +# Easier to test if GDB inserts breakpoints immediately. +gdb_test_no_output "set breakpoint always-inserted on" + +# Force-disable Z1 packets, in case the target actually supports +# these. +if {$is_target_remote} { + gdb_test_no_output "set remote Z-packet off" +} + +# Probe for hw breakpoints support. With Z packets disabled, this +# should always fail with remote targets. For other targets, with no +# way to force-disable hw breakpoints support, best we can do is skip +# the remainder of the test if hardware breakpoint insertion in a +# function in the main executable succeeds. +set cant_insert_hbreak 0 +set supports_hbreak 0 +set test "probe hbreak support" +gdb_test_multiple "hbreak main" $test { + -re "No hardware breakpoint support in the target.*$gdb_prompt $" { + pass $test + } + -re "Hardware breakpoints used exceeds limit.*$gdb_prompt $" { + pass $test + } + -re "Cannot insert hardware breakpoint.*$gdb_prompt $" { + set cant_insert_hbreak 1 + set supports_hbreak 1 + pass $test + } + -re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$gdb_prompt $" { + set supports_hbreak 1 + if {$is_target_remote} { + # Z-packets have been force-disabled, so this shouldn't + # happen. + fail $test + } else { + pass $test + } + } +} + +if {!$supports_hbreak} { + unsupported "no hbreak support" + return +} + +if {!$cant_insert_hbreak} { + unsupported "can't disable hw breakpoint support" + return +} + +# Get previous hw breakpoint out of the way. +delete_breakpoints + +# Without target support, this should always complain. GDB used to +# suppress the error if the breakpoint was set in a shared library. +# While that makes sense for software breakpoints (the memory might be +# unmapped), it doesn't for hardware breakpoints, as those by +# definition are implemented using a mechanism that is not dependent +# on being able to modify the target's memory. +gdb_test "hbreak shrfunc" "Cannot insert hardware breakpoint.*" \ + "hbreak shrfunc complains" + +gdb_test "info break" "hw breakpoint.*y.*$hex.*in shrfunc at.*" \ + "breakpoint not pending" diff --git a/gdb/testsuite/gdb.base/hbreak-unmapped.c b/gdb/testsuite/gdb.base/hbreak-unmapped.c new file mode 100644 index 0000000..4b94803 --- /dev/null +++ b/gdb/testsuite/gdb.base/hbreak-unmapped.c @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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/>. */ + +int +main (void) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.base/hbreak-unmapped.exp b/gdb/testsuite/gdb.base/hbreak-unmapped.exp new file mode 100644 index 0000000..5cb655c --- /dev/null +++ b/gdb/testsuite/gdb.base/hbreak-unmapped.exp @@ -0,0 +1,72 @@ +# Copyright 2014 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/>. + +if {[skip_hw_breakpoint_tests]} { + return 0 +} + +standard_testfile + +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { + return -1 +} + +if ![runto_main] { + fail "Can't run to main" + return -1 +} + +delete_breakpoints + +# Test whether the target supports hardware breakpoints at all. + +set supports_hbreak 0 +set test "probe hardware breakpoint support" +gdb_test_multiple "hbreak main" $test { + -re "No hardware breakpoint support in the target.*$gdb_prompt $" { + pass $test + } + -re "Hardware breakpoints used exceeds limit.*$gdb_prompt $" { + pass $test + } + -re "Hardware assisted breakpoint.*at.* file .*$srcfile, line.*$gdb_prompt $" { + set supports_hbreak 1 + pass $test + } +} + +if {!$supports_hbreak} { + unsupported "hardware breakpoints" + return +} + +delete_breakpoints + +# Force immediate breakpoint insertion. +gdb_test_no_output "set breakpoint always-inserted on" + +# Hardware breakpoints are implemented using a mechanism that is not +# dependent on being able to modify the target's memory, we should be +# able to set them even in unmapped memory areas. +gdb_test "hbreak *0" "Hardware assisted breakpoint \[0-9\]+ at 0x0" + +gdb_test "info break" "hw breakpoint.*y.*0x0\+\[ \t\]\+" \ + "info break shows hw breakpoint" + +gdb_test_no_output "delete \$bpnum" "" "delete" \ + "delete hw breakpoint" + +gdb_test "info break" "No breakpoints or watchpoints\." \ + "info break shows no breakpoints" diff --git a/gdb/testsuite/gdb.trace/qtro.exp b/gdb/testsuite/gdb.trace/qtro.exp index 8470a0f..22b5051 100644 --- a/gdb/testsuite/gdb.trace/qtro.exp +++ b/gdb/testsuite/gdb.trace/qtro.exp @@ -35,22 +35,6 @@ if ![runto_main] { # Check whether we're testing with the remote or extended-remote # targets, and whether the target supports tracepoints. -proc gdb_is_target_remote { } { - global gdb_prompt - - set test "probe for target remote" - gdb_test_multiple "maint print target-stack" $test { - -re ".*emote serial target in gdb-specific protocol.*$gdb_prompt $" { - pass $test - return 1 - } - -re "$gdb_prompt $" { - pass $test - } - } - return 0 -} - if ![gdb_is_target_remote] { return -1 } diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index d904b81..a9fdc99 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -2454,6 +2454,25 @@ proc skip_libstdcxx_probe_tests {} { return $ok } +# Check whether we're testing with the remote or extended-remote +# targets. + +proc gdb_is_target_remote {} { + global gdb_prompt + + set test "probe for target remote" + gdb_test_multiple "maint print target-stack" $test { + -re ".*emote serial target in gdb-specific protocol.*$gdb_prompt $" { + pass $test + return 1 + } + -re "$gdb_prompt $" { + pass $test + } + } + return 0 +} + set compiler_info "unknown" set gcc_compiled 0 set hp_cc_compiler 0 |