Handle memory write errors on gdb.base/break-always.exp
Commit Message
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(-)
Comments
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.
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" "" \
>
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.
@@ -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" "" \