Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH] Failure to stop at duplicate breakpoints
@ 2012-09-20 15:10 Andrew Burgess
  2012-09-20 18:40 ` Sergio Durigan Junior
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2012-09-20 15:10 UTC (permalink / raw)
  To: gdb-patches

When two breakpoints are created at the same location, one of them is 
marked as a duplicate.  When gdb inserts the breakpoints we only really 
insert one breakpoint at any unique location.

By creating duplicate breakpoints and deleting or disabling them in the 
right order it is possible to get into a state where gdb has a single 
breakpoint with a single location, but that location is marked duplicate 
and so is never inserted, with the result we don't stop at the breakpoint.

Patch and test included below.

OK to apply?

Thanks
Andrew

gdb/ChangeLog

2012-09-20  Andrew Burgess  <aburgess@broadcom.com>

	* breakpoint.c (update_global_location_list): Ignore previous
	duplicate status of a breakpoint when starting a new scan for
	duplicate breakpoints.

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index b841bcd..f771d06 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -12463,7 +12463,7 @@ update_global_location_list (int should_insert)
        struct bp_location **loc_first_p;
        b = loc->owner;

-      if (!should_be_inserted (loc)
+      if (!unduplicated_should_be_inserted (loc)
           || !breakpoint_address_is_meaningful (b)
           /* Don't detect duplicate for tracepoint locations because 
they are
            never duplicated.  See the comments in field `duplicate' of

gdb/testsuite/ChangeLog

2012-09-20  Andrew Burgess  <aburgess@broadcom.com>

	* gdb.base/duplicate-bp.c: New file.
	* gdb.base/duplicate-bp.exp: New file.

diff --git a/gdb/testsuite/gdb.base/duplicate-bp.c 
b/gdb/testsuite/gdb.base/duplicate-bp.c
new file mode 100644
index 0000000..50145b4
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.c
@@ -0,0 +1,23 @@
+void
+spacer ()
+{
+  /* Nothing.  */
+}
+
+void
+breakpt ()
+{
+  /* Nothing.  */
+}
+
+int
+main ()
+{
+  spacer ();
+
+  breakpt ();
+
+  spacer ();
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/duplicate-bp.exp 
b/gdb/testsuite/gdb.base/duplicate-bp.exp
new file mode 100644
index 0000000..021aa30
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.exp
@@ -0,0 +1,137 @@
+# Copyright 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/>.
+
+if { [prepare_for_testing duplicate-bp.exp "duplicate-bp" 
{duplicate-bp.c} {debug nowarnings}] } {
+    return -1
+}
+set srcfile "duplicate-bp.c"
+
+# Setup for the test, create COUNT breakpoints at the function BREAKPT.
+proc test_setup { count } {
+    upvar srcfile srcfile
+
+    clean_restart duplicate-bp
+
+    if ![runto_main] then {
+	fail "can't run to main"
+	return 0
+    }
+
+    for {set i 1} {$i <= $count} {incr i} {
+	gdb_breakpoint "breakpt"
+	gdb_test_no_output "set \$bp_num_${i} = \$bpnum"
+    }
+
+    gdb_test "step" "spacer \\(\\) at .*$srcfile:\[0-9\]+.*"
+
+    return 1
+}
+
+
+# Test 1: Create two breakpoints at BREAKPT.  Delete #1 and expect to stop
+# at #2.
+test_setup 2
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"delete #1, stop at #2"
+
+# Test 2: Create two breakpoints at BREAKPT.  Delete #2 and expect to stop
+# at #1.
+test_setup 2
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"delete #2, stop at #1"
+
+# Test 3: Create three breakpoints at BREAKPT.  Disable #1, delete #2,
+# expect to stop at #3.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_1}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #1, delete #2, stop at #3"
+
+# Test 4: Create three breakpoints at BREAKPT.  Disable #2, delete #1,
+# expect to stop at #3.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_2}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #2, delete #1, stop at #3"
+
+# Test 5: Create three breakpoints at BREAKPT.  Disable #1, delete #3,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_1}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_3}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #1, delete #3, stop at #1"
+
+# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #1,
+# expect to stop at #2.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_3}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #3, delete #1, stop at #2"
+
+# Test 7: Create three breakpoints at BREAKPT.  Disable #2, delete #3,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_2}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_3}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #2, delete #3, stop at #1"
+
+# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #2,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_3}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) 
at .*$srcfile:\[0-9\]+.*" \
+			"disable #3, delete #2, stop at #1"




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-20 15:10 [PATCH] Failure to stop at duplicate breakpoints Andrew Burgess
@ 2012-09-20 18:40 ` Sergio Durigan Junior
  2012-09-20 23:21   ` Andrew Burgess
  0 siblings, 1 reply; 7+ messages in thread
From: Sergio Durigan Junior @ 2012-09-20 18:40 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

On Thursday, September 20 2012, Andrew Burgess wrote:

> When two breakpoints are created at the same location, one of them is
> marked as a duplicate.  When gdb inserts the breakpoints we only
> really insert one breakpoint at any unique location.
>
> By creating duplicate breakpoints and deleting or disabling them in
> the right order it is possible to get into a state where gdb has a
> single breakpoint with a single location, but that location is marked
> duplicate and so is never inserted, with the result we don't stop at
> the breakpoint.
>
> Patch and test included below.

Thanks for the patches, but your mail client messed with them, probably.
They are malformed in several places.

-- 
Sergio


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-20 18:40 ` Sergio Durigan Junior
@ 2012-09-20 23:21   ` Andrew Burgess
  2012-09-25 16:16     ` Pedro Alves
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2012-09-20 23:21 UTC (permalink / raw)
  To: gdb-patches; +Cc: Sergio Durigan Junior

On 20/09/2012 7:40 PM, Sergio Durigan Junior wrote:
> On Thursday, September 20 2012, Andrew Burgess wrote:
> 
>> When two breakpoints are created at the same location, one of them is
>> marked as a duplicate.  When gdb inserts the breakpoints we only
>> really insert one breakpoint at any unique location.
>>
>> By creating duplicate breakpoints and deleting or disabling them in
>> the right order it is possible to get into a state where gdb has a
>> single breakpoint with a single location, but that location is marked
>> duplicate and so is never inserted, with the result we don't stop at
>> the breakpoint.
>>
>> Patch and test included below.
> 
> Thanks for the patches, but your mail client messed with them, probably.
> They are malformed in several places.

Sorry for the badly formatted patch, I believe I've fixed the issue, and
the version below should be more readable.

OK to apply?

Thanks,
Andrew


gdb/ChangeLog

2012-09-20  Andrew Burgess  <aburgess@broadcom.com>

	* breakpoint.c (update_global_location_list): Ignore previous
	duplicate status of a breakpoint when starting a new scan for
	duplicate breakpoints.


diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index b841bcd..f771d06 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -12463,7 +12463,7 @@ update_global_location_list (int should_insert)
       struct bp_location **loc_first_p;
       b = loc->owner;
 
-      if (!should_be_inserted (loc)
+      if (!unduplicated_should_be_inserted (loc)
 	  || !breakpoint_address_is_meaningful (b)
 	  /* Don't detect duplicate for tracepoint locations because they are
 	   never duplicated.  See the comments in field `duplicate' of

gdb/testsuite/ChangeLog

2012-09-20  Andrew Burgess  <aburgess@broadcom.com>

	* gdb.base/duplicate-bp.c: New file.
	* gdb.base/duplicate-bp.exp: New file.

diff --git a/gdb/testsuite/gdb.base/duplicate-bp.c b/gdb/testsuite/gdb.base/duplicate-bp.c
new file mode 100644
index 0000000..50145b4
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.c
@@ -0,0 +1,23 @@
+void
+spacer ()
+{
+  /* Nothing.  */
+}
+
+void
+breakpt ()
+{
+  /* Nothing.  */
+}
+
+int
+main ()
+{
+  spacer ();
+
+  breakpt ();
+
+  spacer ();
+  
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/duplicate-bp.exp b/gdb/testsuite/gdb.base/duplicate-bp.exp
new file mode 100644
index 0000000..021aa30
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.exp
@@ -0,0 +1,137 @@
+# Copyright 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/>.
+
+if { [prepare_for_testing duplicate-bp.exp "duplicate-bp" {duplicate-bp.c} {debug nowarnings}] } {
+    return -1
+}
+set srcfile "duplicate-bp.c"
+
+# Setup for the test, create COUNT breakpoints at the function BREAKPT.
+proc test_setup { count } {
+    upvar srcfile srcfile
+
+    clean_restart duplicate-bp
+
+    if ![runto_main] then { 
+	fail "can't run to main" 
+	return 0
+    }
+
+    for {set i 1} {$i <= $count} {incr i} {
+	gdb_breakpoint "breakpt"
+	gdb_test_no_output "set \$bp_num_${i} = \$bpnum"
+    }
+
+    gdb_test "step" "spacer \\(\\) at .*$srcfile:\[0-9\]+.*"
+    
+    return 1
+}
+
+
+# Test 1: Create two breakpoints at BREAKPT.  Delete #1 and expect to stop
+# at #2.
+test_setup 2
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"delete #1, stop at #2"
+
+# Test 2: Create two breakpoints at BREAKPT.  Delete #2 and expect to stop
+# at #1.
+test_setup 2 
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"delete #2, stop at #1"
+
+# Test 3: Create three breakpoints at BREAKPT.  Disable #1, delete #2,
+# expect to stop at #3.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_1}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #1, delete #2, stop at #3"
+
+# Test 4: Create three breakpoints at BREAKPT.  Disable #2, delete #1,
+# expect to stop at #3.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_2}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #2, delete #1, stop at #3"
+
+# Test 5: Create three breakpoints at BREAKPT.  Disable #1, delete #3,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_1}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_3}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #1, delete #3, stop at #1"
+
+# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #1,
+# expect to stop at #2.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_3}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_1}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #3, delete #1, stop at #2"
+
+# Test 7: Create three breakpoints at BREAKPT.  Disable #2, delete #3,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_2}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_3}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #2, delete #3, stop at #1"
+
+# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #2,
+# expect to stop at #1.
+test_setup 3
+
+gdb_test_no_output {disable $bp_num_3}
+
+gdb_test "step" ".*"
+
+gdb_test_no_output {delete $bp_num_2}
+
+gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+			"disable #3, delete #2, stop at #1"



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-20 23:21   ` Andrew Burgess
@ 2012-09-25 16:16     ` Pedro Alves
  2012-09-25 21:48       ` Andrew Burgess
  0 siblings, 1 reply; 7+ messages in thread
From: Pedro Alves @ 2012-09-25 16:16 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches, Sergio Durigan Junior

Hi Andrew,

On 09/21/2012 12:20 AM, Andrew Burgess wrote:

> 2012-09-20  Andrew Burgess  <aburgess@broadcom.com>
> 
> 	* breakpoint.c (update_global_location_list): Ignore previous
> 	duplicate status of a breakpoint when starting a new scan for
> 	duplicate breakpoints.

This one's okay.

> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/duplicate-bp.c

Please add the standard copyright header boilerplate.  Even if the
contents of the file don't have that much copyrightable content
now, it's better to always add a header as a rule, than to
police later changes to files and worry about having to add
a header then.

> @@ -0,0 +1,23 @@
> +void
> +spacer ()
> +{
> +  /* Nothing.  */
> +}
> +
> +void
> +breakpt ()
> +{
> +  /* Nothing.  */
> +}
> +
> +int
> +main ()
> +{
> +  spacer ();
> +
> +  breakpt ();
> +
> +  spacer ();
> +  
> +  return 0;
> +}
> diff --git a/gdb/testsuite/gdb.base/duplicate-bp.exp b/gdb/testsuite/gdb.base/duplicate-bp.exp
> new file mode 100644
> index 0000000..021aa30
> --- /dev/null
> +++ b/gdb/testsuite/gdb.base/duplicate-bp.exp
> @@ -0,0 +1,137 @@
> +# Copyright 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/>.
> +
> +if { [prepare_for_testing duplicate-bp.exp "duplicate-bp" {duplicate-bp.c} {debug nowarnings}] } {

Could you make this use standard_testfile? Like:

standard_testfile

if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile {debug nowarnings}] } {


> +    return -1
> +}
> +set srcfile "duplicate-bp.c"

This won't be needed then.

While at it, is "nowarnings" really necessary?


> +
> +# Setup for the test, create COUNT breakpoints at the function BREAKPT.
> +proc test_setup { count } {
> +    upvar srcfile srcfile

It is more idiomatic in our testsuite to use "global srcfile".

> +
> +    clean_restart duplicate-bp
> +
> +    if ![runto_main] then { 
> +	fail "can't run to main" 
> +	return 0
> +    }
> +
> +    for {set i 1} {$i <= $count} {incr i} {
> +	gdb_breakpoint "breakpt"
> +	gdb_test_no_output "set \$bp_num_${i} = \$bpnum"
> +    }
> +
> +    gdb_test "step" "spacer \\(\\) at .*$srcfile:\[0-9\]+.*"
> +    
> +    return 1
> +}
> +
> +
> +# Test 1: Create two breakpoints at BREAKPT.  Delete #1 and expect to stop
> +# at #2.
> +test_setup 2
> +
> +gdb_test_no_output {delete $bp_num_1}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"delete #1, stop at #2"
> +
> +# Test 2: Create two breakpoints at BREAKPT.  Delete #2 and expect to stop
> +# at #1.
> +test_setup 2 
> +
> +gdb_test_no_output {delete $bp_num_2}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"delete #2, stop at #1"
> +
> +# Test 3: Create three breakpoints at BREAKPT.  Disable #1, delete #2,
> +# expect to stop at #3.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_1}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_2}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #1, delete #2, stop at #3"
> +
> +# Test 4: Create three breakpoints at BREAKPT.  Disable #2, delete #1,
> +# expect to stop at #3.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_2}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_1}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #2, delete #1, stop at #3"
> +
> +# Test 5: Create three breakpoints at BREAKPT.  Disable #1, delete #3,
> +# expect to stop at #1.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_1}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_3}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #1, delete #3, stop at #1"
> +
> +# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #1,
> +# expect to stop at #2.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_3}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_1}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #3, delete #1, stop at #2"
> +
> +# Test 7: Create three breakpoints at BREAKPT.  Disable #2, delete #3,
> +# expect to stop at #1.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_2}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_3}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #2, delete #3, stop at #1"
> +
> +# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #2,
> +# expect to stop at #1.
> +test_setup 3
> +
> +gdb_test_no_output {disable $bp_num_3}
> +
> +gdb_test "step" ".*"
> +
> +gdb_test_no_output {delete $bp_num_2}
> +
> +gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
> +			"disable #3, delete #2, stop at #1"
> 
> 

There are many duplicate test output messages in the .sum file:

$ cat testsuite/gdb.sum | grep PASS | sort | uniq -c | sort -n
      1 PASS: gdb.base/duplicate-bp.exp: delete #1, stop at #2
      1 PASS: gdb.base/duplicate-bp.exp: delete #2, stop at #1
      1 PASS: gdb.base/duplicate-bp.exp: disable #1, delete #2, stop at #3
      1 PASS: gdb.base/duplicate-bp.exp: disable #1, delete #3, stop at #1
      1 PASS: gdb.base/duplicate-bp.exp: disable #2, delete #1, stop at #3
      1 PASS: gdb.base/duplicate-bp.exp: disable #2, delete #3, stop at #1
      1 PASS: gdb.base/duplicate-bp.exp: disable #3, delete #1, stop at #2
      1 PASS: gdb.base/duplicate-bp.exp: disable #3, delete #2, stop at #1
      2 PASS: gdb.base/duplicate-bp.exp: delete $bp_num_3
      2 PASS: gdb.base/duplicate-bp.exp: disable $bp_num_1
      2 PASS: gdb.base/duplicate-bp.exp: disable $bp_num_2
      2 PASS: gdb.base/duplicate-bp.exp: disable $bp_num_3
      3 PASS: gdb.base/duplicate-bp.exp: delete $bp_num_1
      3 PASS: gdb.base/duplicate-bp.exp: delete $bp_num_2
      6 PASS: gdb.base/duplicate-bp.exp: set $bp_num_3 = $bpnum
      8 PASS: gdb.base/duplicate-bp.exp: set $bp_num_1 = $bpnum
      8 PASS: gdb.base/duplicate-bp.exp: set $bp_num_2 = $bpnum
     14 PASS: gdb.base/duplicate-bp.exp: step

Could you please make them all unique?

http://sourceware.org/gdb/wiki/GDBTestcaseCookbook#Make_sure_test_messages_are_unique

You can use with_test_prefix to group tests, for example.

Also, please get rid of the trailing whitespace the patch is adding:

$ git am ~/unduplicate.mbox
Applying: Failure to stop at duplicate breakpoints
/home/pedro/gdb/mygit/src/.git/rebase-apply/patch:48: trailing whitespace.

/home/pedro/gdb/mygit/src/.git/rebase-apply/patch:83: trailing whitespace.
    if ![runto_main] then {
/home/pedro/gdb/mygit/src/.git/rebase-apply/patch:84: trailing whitespace.
        fail "can't run to main"
/home/pedro/gdb/mygit/src/.git/rebase-apply/patch:94: trailing whitespace.

/home/pedro/gdb/mygit/src/.git/rebase-apply/patch:110: trailing whitespace.
test_setup 2
warning: 5 lines add whitespace errors.

Thanks!

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-25 16:16     ` Pedro Alves
@ 2012-09-25 21:48       ` Andrew Burgess
  2012-09-26 15:06         ` Pedro Alves
  0 siblings, 1 reply; 7+ messages in thread
From: Andrew Burgess @ 2012-09-25 21:48 UTC (permalink / raw)
  To: gdb-patches

Pedro,

Thanks for taking the time to review my patch.  I've addressed the issues you raised, and 

On 25/09/2012 5:15 PM, Pedro Alves wrote:
> 
>> --- /dev/null
>> +++ b/gdb/testsuite/gdb.base/duplicate-bp.c
> 
> Please add the standard copyright header boilerplate.  Even if the
> contents of the file don't have that much copyrightable content
> now, it's better to always add a header as a rule, than to
> police later changes to files and worry about having to add
> a header then.

Done.

>> +
>> +if { [prepare_for_testing duplicate-bp.exp "duplicate-bp" {duplicate-bp.c} {debug nowarnings}] } {
> 
> Could you make this use standard_testfile? Like:
> 
> standard_testfile
> 
> if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile {debug nowarnings}] } {

Done, well it turns out "prepare_for_testing ${testfile}.exp ${testfile}" is enough.

> 
> 
>> +    return -1
>> +}
>> +set srcfile "duplicate-bp.c"
> 
> This won't be needed then.
> 
> While at it, is "nowarnings" really necessary?

Removed.

> 
> 
>> +
>> +# Setup for the test, create COUNT breakpoints at the function BREAKPT.
>> +proc test_setup { count } {
>> +    upvar srcfile srcfile
> 
> It is more idiomatic in our testsuite to use "global srcfile".

Fixed.

> 
> There are many duplicate test output messages in the .sum file:
>

They should all be unique now.
 
> 
> Also, please get rid of the trailing whitespace the patch is adding:
> 

Done.

Again, thanks for taking the time to review this patch.

Cheers,

Andrew


gdb/ChangeLog

2012-09-25  Andrew Burgess  <aburgess@broadcom.com>

	* breakpoint.c (update_global_location_list): Ignore previous
	duplicate status of a breakpoint when starting a new scan for
	duplicate breakpoints.

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index b841bcd..f771d06 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -12463,7 +12463,7 @@ update_global_location_list (int should_insert)
       struct bp_location **loc_first_p;
       b = loc->owner;
 
-      if (!should_be_inserted (loc)
+      if (!unduplicated_should_be_inserted (loc)
 	  || !breakpoint_address_is_meaningful (b)
 	  /* Don't detect duplicate for tracepoint locations because they are
 	   never duplicated.  See the comments in field `duplicate' of


gdb/testsuite/ChangeLog

2012-09-25  Andrew Burgess  <aburgess@broadcom.com>

	* gdb.base/duplicate-bp.c: New file.
	* gdb.base/duplicate-bp.exp: New file.

diff --git a/gdb/testsuite/gdb.base/duplicate-bp.c b/gdb/testsuite/gdb.base/duplicate-bp.c
new file mode 100644
index 0000000..662a7c4
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.c
@@ -0,0 +1,40 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 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/>.  */
+
+void
+spacer ()
+{
+  /* Nothing.  */
+}
+
+void
+breakpt ()
+{
+  /* Nothing.  */
+}
+
+int
+main ()
+{
+  spacer ();
+
+  breakpt ();
+
+  spacer ();
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/duplicate-bp.exp b/gdb/testsuite/gdb.base/duplicate-bp.exp
new file mode 100644
index 0000000..01279fb
--- /dev/null
+++ b/gdb/testsuite/gdb.base/duplicate-bp.exp
@@ -0,0 +1,156 @@
+# Copyright 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
+}
+
+# Setup for the test, create COUNT breakpoints at the function BREAKPT.
+proc test_setup { count } {
+    global srcfile
+
+    clean_restart duplicate-bp
+
+    if ![runto_main] then {
+	fail "can't run to main"
+	return 0
+    }
+
+    for {set i 1} {$i <= $count} {incr i} {
+	gdb_breakpoint "breakpt"
+	gdb_test_no_output "set \$bp_num_${i} = \$bpnum"
+    }
+
+    gdb_test "step" \
+	"spacer \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"step to place breakpoints"
+
+    return 1
+}
+
+
+# Test 1: Create two breakpoints at BREAKPT.  Delete #1 and expect to stop
+# at #2.
+with_test_prefix "del_1_stop_2" {
+    test_setup 2
+
+    gdb_test_no_output {delete $bp_num_1}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"delete #1, stop at #2"
+}
+
+# Test 2: Create two breakpoints at BREAKPT.  Delete #2 and expect to stop
+# at #1.
+with_test_prefix "del_2_stop_1" {
+    test_setup 2
+
+    gdb_test_no_output {delete $bp_num_2}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"delete #2, stop at #1"
+}
+
+# Test 3: Create three breakpoints at BREAKPT.  Disable #1, delete #2,
+# expect to stop at #3.
+with_test_prefix "dis_1_del_2_stop_3" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_1}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_2}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #1, delete #2, stop at #3"
+}
+
+# Test 4: Create three breakpoints at BREAKPT.  Disable #2, delete #1,
+# expect to stop at #3.
+with_test_prefix "dis_2_del_1_stop_3" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_2}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_1}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #2, delete #1, stop at #3"
+}
+
+# Test 5: Create three breakpoints at BREAKPT.  Disable #1, delete #3,
+# expect to stop at #2.
+with_test_prefix "dis_1_del_3_stop_1" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_1}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_3}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #1, delete #3, stop at #2"
+}
+
+# Test 6: Create three breakpoints at BREAKPT.  Disable #3, delete #1,
+# expect to stop at #2
+with_test_prefix "dis_3_del_1_stop_2" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_3}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_1}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #3, delete #1, stop at #2"
+}
+
+# Test 7: Create three breakpoints at BREAKPT.  Disable #2, delete #3,
+# expect to stop at #1.
+with_test_prefix "dis_2_del_3_stop_1" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_2}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_3}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #2, delete #3, stop at #1"
+}
+
+# Test 8: Create three breakpoints at BREAKPT.  Disable #3, delete #2,
+# expect to stop at #1.
+with_test_prefix "dis_3_del_2_stop_1" {
+    test_setup 3
+
+    gdb_test_no_output {disable $bp_num_3}
+
+    gdb_test "step" ".*"
+
+    gdb_test_no_output {delete $bp_num_2}
+
+    gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, breakpt \\(\\) at .*$srcfile:\[0-9\]+.*" \
+	"disable #3, delete #2, stop at #1"
+}



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-25 21:48       ` Andrew Burgess
@ 2012-09-26 15:06         ` Pedro Alves
  2012-09-26 16:37           ` Andrew Burgess
  0 siblings, 1 reply; 7+ messages in thread
From: Pedro Alves @ 2012-09-26 15:06 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

On 09/25/2012 10:48 PM, Andrew Burgess wrote:
> Pedro,
> 
> Thanks for taking the time to review my patch.  I've addressed the issues you raised, and 

Great, thanks.  Just one little more I missed before:

> +standard_testfile
> +
> +if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
> +    return -1
> +}
> +
> +# Setup for the test, create COUNT breakpoints at the function BREAKPT.
> +proc test_setup { count } {
> +    global srcfile

    global binfile

and

> +    clean_restart duplicate-bp

instead:

    clean_restart $binfile

Okay with that change.  Thanks again.

-- 
Pedro Alves


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Failure to stop at duplicate breakpoints
  2012-09-26 15:06         ` Pedro Alves
@ 2012-09-26 16:37           ` Andrew Burgess
  0 siblings, 0 replies; 7+ messages in thread
From: Andrew Burgess @ 2012-09-26 16:37 UTC (permalink / raw)
  To: gdb-patches; +Cc: Pedro Alves

On 26/09/2012 4:06 PM, Pedro Alves wrote:
> On 09/25/2012 10:48 PM, Andrew Burgess wrote:
>> Pedro,
>>
>> Thanks for taking the time to review my patch.  I've addressed the issues you raised, and 
> 
> Great, thanks.  Just one little more I missed before:
> 
>> +standard_testfile
>> +
>> +if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
>> +    return -1
>> +}
>> +
>> +# Setup for the test, create COUNT breakpoints at the function BREAKPT.
>> +proc test_setup { count } {
>> +    global srcfile
> 
>     global binfile
> 
> and
> 
>> +    clean_restart duplicate-bp
> 
> instead:
> 
>     clean_restart $binfile
> 
> Okay with that change.  Thanks again.

Have committed with that small fix.

Thanks for your review.
Andrew





^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-09-26 16:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-09-20 15:10 [PATCH] Failure to stop at duplicate breakpoints Andrew Burgess
2012-09-20 18:40 ` Sergio Durigan Junior
2012-09-20 23:21   ` Andrew Burgess
2012-09-25 16:16     ` Pedro Alves
2012-09-25 21:48       ` Andrew Burgess
2012-09-26 15:06         ` Pedro Alves
2012-09-26 16:37           ` Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox