This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PR gdb/14810 - disabled breakpoint locations shouldn't explain stops, but they do.


(Another issue some other test caught by forcing software single-step
all-the-way.)

static int
function (void)
{
  return 1; /* step stops here */
}

int
main ()
{
  function ();
  return 0;
}

(gdb) start
...
(gdb) break function
Breakpoint 2 at 0x400540: file disabled-location.c, line 4.
disable $bpnum.1
(gdb) step

Breakpoint 2, function () at disabled-location.c:4
4        return 1; /* step stops here */


The "Breakpoint 2, function" line is saying that the "step" hit the
breakpoint, but it hasn't, because the breakpoint wasn't even
inserted.  The "step" just happened to land at the same address the
breakpoint would be inserted.

bpstat_stop_status skips disabled breakpoints, but fails to check the
enablement of specific locations.

Tested on x86_64 Fedora 17, and applied.

gdb/
2012-11-06  Pedro Alves  <palves@redhat.com>

	PR gdb/14810

	* breakpoint.c (bpstat_stop_status): Skip disabled locations.

gdb/testsuite/
2012-11-06  Pedro Alves  <palves@redhat.com>

	PR gdb/14810

	* gdb.base/disabled-location.c: New file.
	* gdb.base/disabled-location.exp: New file.
---
 gdb/breakpoint.c                             |    2 +
 gdb/testsuite/gdb.base/disabled-location.c   |   29 ++++++++++++++++++
 gdb/testsuite/gdb.base/disabled-location.exp |   41 ++++++++++++++++++++++++++
 3 files changed, 71 insertions(+), 1 deletion(-)
 create mode 100644 gdb/testsuite/gdb.base/disabled-location.c
 create mode 100644 gdb/testsuite/gdb.base/disabled-location.exp

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 851dd86..e4ba90d 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -5175,7 +5175,7 @@ bpstat_stop_status (struct address_space *aspace,
 	  if (b->type == bp_hardware_watchpoint && bl != b->loc)
 	    break;
 
-	  if (bl->shlib_disabled)
+	  if (!bl->enabled || bl->shlib_disabled)
 	    continue;
 
 	  if (!bpstat_check_location (bl, aspace, bp_addr, ws))
diff --git a/gdb/testsuite/gdb.base/disabled-location.c b/gdb/testsuite/gdb.base/disabled-location.c
new file mode 100644
index 0000000..5325d5e
--- /dev/null
+++ b/gdb/testsuite/gdb.base/disabled-location.c
@@ -0,0 +1,29 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright (C) 2012 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/>.  */
+
+static int
+function (void)
+{
+  return 1; /* step stops here */
+}
+
+int
+main ()
+{
+  function ();
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/disabled-location.exp b/gdb/testsuite/gdb.base/disabled-location.exp
new file mode 100644
index 0000000..675cbb0
--- /dev/null
+++ b/gdb/testsuite/gdb.base/disabled-location.exp
@@ -0,0 +1,41 @@
+# Copyright (C) 2012 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/>.
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
+    return -1
+}
+
+if ![runto_main] then {
+   fail "Can't run to main"
+   return 0
+}
+
+gdb_test "break function" \
+    "Breakpoint.*at.* file .*$srcfile, line.*" \
+    "setting breakpoint on function"
+
+gdb_test_no_output "disable \$bpnum.1" "disable location"
+
+set test "step doesn't trip on disabled location"
+gdb_test_multiple "step" $test {
+    -re "Breakpoint .*$gdb_prompt $" {
+	fail $test
+    }
+    -re "function \\(\\) at .*$srcfile:.*step stops here.*$gdb_prompt $" {
+	pass $test
+    }
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]