Patchwork Handle memory write errors on gdb.base/break-always.exp

login
register
mail settings
Submitter Luis Machado
Date April 13, 2015, 6:21 p.m.
Message ID <1428949306-15524-1-git-send-email-lgustavo@codesourcery.com>
Download mbox | patch
Permalink /patch/6188/
State New
Headers show

Comments

Luis Machado - April 13, 2015, 6:21 p.m.
This is another case of the testcase not handling memory write errors that
happen on some targets (QEMU) when GDB attempts to modify an address that
should contain a breakpoint, for example.

The following patch handles this and prevents spurious failures from
happening. It also adds a foreach loop to avoid duplication of code
and hardcoded patterns.

Regression tested on x86-64-linux and aarch64-linux.

Ok?

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

	gdb/testsuite/
	* gdb.base/break-always.exp: Abort testing if writing to memory
	causes an error.
---
 gdb/testsuite/gdb.base/break-always.exp | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
Yao Qi - April 14, 2015, 9 a.m.
Luis Machado <lgustavo@codesourcery.com> writes:

Hi Luis,

> +foreach test_value {0 1} {
> +    set write_test "write $test_value to breakpoint's address $bp_address"
> +

In this way, $bp_address will be shown in the test summary in gdb.sum.
This may cause some differences when we compare gdb.sum of different
runs, like:

-PASS: gdb.base/break-always.exp: write 0 to breakpoint's address 0x1111
+PASS: gdb.base/break-always.exp: write 0 to breakpoint's address 0x2222

Let's remove $bp_address from $write_test.

> +    gdb_test_multiple "p /x *(char *) $bp_address = $test_value" $write_test {
> +	-re "Cannot access memory at address $hex.*$gdb_prompt $" {
> +	  unsupported "Cannot write to address $bp_address"

We need comments to explain we may go here.  Copying some messages from
your mail should be fine.

> +	  return -1
> +	}
> +	-re " = .*$gdb_prompt $" {
> +	  pass $write_test
> +	}
> +    }
> +
> +    set read_test "read back $test_value from the breakpoint's address $bp_address"
> +

Remove $bp_address from $read_test.

> +    gdb_test "p /x *(char *) $bp_address" " = 0x$test_value" $read_test
> +}

Patch is OK to me with these changes.
Luis Machado - April 27, 2015, 3:41 p.m.
Ping?

On 04/13/2015 03:21 PM, Luis Machado wrote:
> This is another case of the testcase not handling memory write errors that
> happen on some targets (QEMU) when GDB attempts to modify an address that
> should contain a breakpoint, for example.
>
> The following patch handles this and prevents spurious failures from
> happening. It also adds a foreach loop to avoid duplication of code
> and hardcoded patterns.
>
> Regression tested on x86-64-linux and aarch64-linux.
>
> Ok?
>
> 2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
>
> 	gdb/testsuite/
> 	* gdb.base/break-always.exp: Abort testing if writing to memory
> 	causes an error.
> ---
>   gdb/testsuite/gdb.base/break-always.exp | 30 +++++++++++++++++-------------
>   1 file changed, 17 insertions(+), 13 deletions(-)
>
> diff --git a/gdb/testsuite/gdb.base/break-always.exp b/gdb/testsuite/gdb.base/break-always.exp
> index 681be37..9133229 100644
> --- a/gdb/testsuite/gdb.base/break-always.exp
> +++ b/gdb/testsuite/gdb.base/break-always.exp
> @@ -69,19 +69,23 @@ gdb_test "p /x \$shadow = *(char *) $bp_address" \
>   # and still leave the breakpoint insn planted.  Try twice with
>   # different values, in case we happen to be writting exactly what was
>   # there already.
> -gdb_test "p /x *(char *) $bp_address = 0" \
> -    " = 0x0" \
> -    "write 0 to breakpoint's address"
> -gdb_test "p /x *(char *) $bp_address" \
> -    " = 0x0" \
> -    "read back 0 from the breakpoint's address"
> -
> -gdb_test "p /x *(char *) $bp_address = 1" \
> -    " = 0x1" \
> -    "write 1 to breakpoint's address"
> -gdb_test "p /x *(char *) $bp_address" \
> -    " = 0x1" \
> -    "read back 1 from the breakpoint's address"
> +foreach test_value {0 1} {
> +    set write_test "write $test_value to breakpoint's address $bp_address"
> +
> +    gdb_test_multiple "p /x *(char *) $bp_address = $test_value" $write_test {
> +	-re "Cannot access memory at address $hex.*$gdb_prompt $" {
> +	  unsupported "Cannot write to address $bp_address"
> +	  return -1
> +	}
> +	-re " = .*$gdb_prompt $" {
> +	  pass $write_test
> +	}
> +    }
> +
> +    set read_test "read back $test_value from the breakpoint's address $bp_address"
> +
> +    gdb_test "p /x *(char *) $bp_address" " = 0x$test_value" $read_test
> +}
>
>   # Restore the original contents.
>   gdb_test "p /x *(char *) $bp_address = \$shadow" "" \
>
Yao Qi - April 28, 2015, 10:46 a.m.
Luis Machado <lgustavo@codesourcery.com> writes:

> Ping?

Hi Luis,
I've approved this patch here
https://sourceware.org/ml/gdb-patches/2015-04/msg00512.html  If my
comments are addressed in the updated patch, you can push it in.

Patch

diff --git a/gdb/testsuite/gdb.base/break-always.exp b/gdb/testsuite/gdb.base/break-always.exp
index 681be37..9133229 100644
--- a/gdb/testsuite/gdb.base/break-always.exp
+++ b/gdb/testsuite/gdb.base/break-always.exp
@@ -69,19 +69,23 @@  gdb_test "p /x \$shadow = *(char *) $bp_address" \
 # and still leave the breakpoint insn planted.  Try twice with
 # different values, in case we happen to be writting exactly what was
 # there already.
-gdb_test "p /x *(char *) $bp_address = 0" \
-    " = 0x0" \
-    "write 0 to breakpoint's address"
-gdb_test "p /x *(char *) $bp_address" \
-    " = 0x0" \
-    "read back 0 from the breakpoint's address"
-
-gdb_test "p /x *(char *) $bp_address = 1" \
-    " = 0x1" \
-    "write 1 to breakpoint's address"
-gdb_test "p /x *(char *) $bp_address" \
-    " = 0x1" \
-    "read back 1 from the breakpoint's address"
+foreach test_value {0 1} {
+    set write_test "write $test_value to breakpoint's address $bp_address"
+
+    gdb_test_multiple "p /x *(char *) $bp_address = $test_value" $write_test {
+	-re "Cannot access memory at address $hex.*$gdb_prompt $" {
+	  unsupported "Cannot write to address $bp_address"
+	  return -1
+	}
+	-re " = .*$gdb_prompt $" {
+	  pass $write_test
+	}
+    }
+
+    set read_test "read back $test_value from the breakpoint's address $bp_address"
+
+    gdb_test "p /x *(char *) $bp_address" " = 0x$test_value" $read_test
+}
 
 # Restore the original contents.
 gdb_test "p /x *(char *) $bp_address = \$shadow" "" \