Harden gdb.base/bp-permanent.exp
authorLuis Machado <lgustavo@codesourcery.com>
Mon, 13 Apr 2015 17:45:56 +0000 (14:45 -0300)
committerLuis Machado <lgustavo@codesourcery.com>
Mon, 13 Apr 2015 17:45:56 +0000 (14:45 -0300)
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 ===

After the patch:

                === gdb Summary ===

gdb/testsuite/ChangeLog:
2015-04-13  Luis Machado  <lgustavo@codesourcery.com>

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

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/bp-permanent.exp

index e01fd38137c99e5204d67996be7b59df7398da58..a2f7328138dd87c177c748c0a771be12e421dc2e 100644 (file)
@@ -1,3 +1,8 @@
+2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
+
+       * gdb.base/bp-permanent.exp (test): Handle the case of being unable
+       to write to the .text section.
+
 2015-04-13  Luis Machado  <lgustavo@codesourcery.com>
 
        * gdb.base/coredump-filter.exp: Restrict test to Linux systems only.
index 81a5293e63234ddf7d2278d2eba6bb837a71db22..e802eee263d0c03fe86ba6a32bfb4ecd9baf107a 100644 (file)
@@ -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) will disallow writes to the
+                   # .text section under certain circumstances.  It is no use
+                   # continuing with the test at this point.  Just return.
+                   unsupported "Cannot modify memory"
+                   return
+               }
+               -re " = .*$gdb_prompt $" {
+                   pass $test
+               }
+           }
        }
     }