Patchwork Harden gdb.base/bp-permanent.exp

login
register
mail settings
Submitter Luis Machado
Date April 9, 2015, 5:10 p.m.
Message ID <5526B296.8040000@codesourcery.com>
Download mbox | patch
Permalink /patch/6117/
State New
Headers show

Comments

Luis Machado - April 9, 2015, 5:10 p.m.
This testcase does not work as expected in QEMU (aarch64 QEMU in my 
case). It fails when trying to manually write the breakpoint instruction 
to a certain PC address.

(gdb) p /x addr_bp[0] = buffer[0]^M
Cannot access memory at address 0x400834^M
(gdb) PASS: gdb.base/bp-permanent.exp: always_inserted=off, 
sw_watchpoint=0: setup: p /x addr_bp[0] = buffer[0]
p /x addr_bp[1] = buffer[1]^M
Cannot access memory at address 0x400835^M
(gdb) PASS: gdb.base/bp-permanent.exp: always_inserted=off, 
sw_watchpoint=0: setup: p /x addr_bp[1] = buffer[1]
p /x addr_bp[2] = buffer[2]^M
Cannot access memory at address 0x400836^M
(gdb) PASS: gdb.base/bp-permanent.exp: always_inserted=off, 
sw_watchpoint=0: setup: p /x addr_bp[2] = buffer[2]
p /x addr_bp[3] = buffer[3]^M
Cannot access memory at address 0x400837^M
(gdb) PASS: gdb.base/bp-permanent.exp: always_inserted=off, 
sw_watchpoint=0: setup: p /x addr_bp[3] = buffer[3]

The following patch prevents a number of failures by detecting this and 
bailing out in case the target has such a restriction. Writing to .text 
from within the program isn't any better. It just leads to a SIGSEGV.

Before the patch:

                 === gdb Summary ===

# of expected passes            66
# of unexpected failures        56

After the patch:

                 === gdb Summary ===

# of expected passes            26
# of unsupported tests          4

I regtested this on x86-64 and it still works fine.

Ok?
Pedro Alves - April 10, 2015, 10:04 a.m.
On 04/09/2015 06:10 PM, Luis Machado wrote:

> diff --git a/gdb/testsuite/gdb.base/bp-permanent.exp b/gdb/testsuite/gdb.base/bp-permanent.exp
> index 81a5293..9193db8 100644
> --- a/gdb/testsuite/gdb.base/bp-permanent.exp
> +++ b/gdb/testsuite/gdb.base/bp-permanent.exp
> @@ -104,7 +104,18 @@ proc test {always_inserted sw_watchpoint} {
>  	# to memory manually.
>  	set count [expr $address_after_bp - $address_bp]
>  	for {set i 0} {$i < $count} {incr i} {
> -	    gdb_test "p /x addr_bp\[$i\] = buffer\[$i\]" " = .*"
> +	    gdb_test_multiple "p /x addr_bp\[$i\] = buffer\[$i\]" $test {
> +		-re "Cannot access memory at address $hex.*$gdb_prompt $" {
> +		    # Some targets (QEMU for one) do not allow writes to the
> +		    # .text section.  It is no use continuing with the test
> +		    # at this point. Just return.

Double space after period.

> +		    unsupported $test

Something like:

	    unsupported "Cannot access memory"

OK with those changes.

I'm thinking it'd be good to adjust the test to hardcode the
breakpoint instruction (on an arch by arch basis, leaving the
current generic code in place), as it'd be good to test
stepping past permanent/program trap instructions
on QEMU/Valgrind, etc. too.

Thanks,
Pedro Alves

Patch

2015-04-09  Luis Machado  <lgustavo@codesourcery.com>

	gdb/testsuite/
	* gdb.base/bp-permanent.exp (test): Handle the case of being unable
	to write to the .text section.

diff --git a/gdb/testsuite/gdb.base/bp-permanent.exp b/gdb/testsuite/gdb.base/bp-permanent.exp
index 81a5293..9193db8 100644
--- a/gdb/testsuite/gdb.base/bp-permanent.exp
+++ b/gdb/testsuite/gdb.base/bp-permanent.exp
@@ -104,7 +104,18 @@  proc test {always_inserted sw_watchpoint} {
 	# to memory manually.
 	set count [expr $address_after_bp - $address_bp]
 	for {set i 0} {$i < $count} {incr i} {
-	    gdb_test "p /x addr_bp\[$i\] = buffer\[$i\]" " = .*"
+	    gdb_test_multiple "p /x addr_bp\[$i\] = buffer\[$i\]" $test {
+		-re "Cannot access memory at address $hex.*$gdb_prompt $" {
+		    # Some targets (QEMU for one) do not allow writes to the
+		    # .text section.  It is no use continuing with the test
+		    # at this point. Just return.
+		    unsupported $test
+		    return
+		}
+		-re " = .*$gdb_prompt $" {
+		    pass $test
+		}
+	    }
 	}
     }