Make gdb.base/find-unmapped.exp pass on remote targets
authorPedro Alves <palves@redhat.com>
Fri, 13 Oct 2017 15:34:50 +0000 (16:34 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 13 Oct 2017 15:34:50 +0000 (16:34 +0100)
Currently, with --target_board=native-extended-gdbserver, we get:

  Running .../src/gdb/testsuite/gdb.base/find-unmapped.exp ...
  FAIL: gdb.base/find-unmapped.exp: find global_var_0, global_var_2, 0xff
  FAIL: gdb.base/find-unmapped.exp: find global_var_1, global_var_2, 0xff
  FAIL: gdb.base/find-unmapped.exp: find global_var_2, (global_var_2 + 16), 0xff

This commit makes the test pass there, and also enables in on
--target_board=native-gdbserver, and other remote targets.

I've filed PR gdb/22293 to track the missing-warning problem.

gdb/testsuite/ChangeLog:
2017-10-13  Pedro Alves  <palves@redhat.com>

PR gdb/22293
* gdb.base/find-unmapped.exp: Don't skip if is_remote target.
(top level): Move some tests to ...
(test_not_found): ... this new procedure.
(top level): Call it.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/find-unmapped.exp

index 73389ae495c46219896b9f3abdabb4e091f04762..2e7eb1d6a8b25c2bf2f89d57007898a4616d2ae7 100644 (file)
@@ -1,3 +1,11 @@
+2017-10-13  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/22293
+       * gdb.base/find-unmapped.exp: Don't skip if is_remote target.
+       (top level): Move some tests to ...
+       (test_not_found): ... this new procedure.
+       (top level): Call it.
+
 2017-10-13  Pedro Alves  <palves@redhat.com>
 
        * gdb.base/term.exp: Don't skip if is_remote target.  Instead,
index 9982d0c96d201f3107625a5ad97ac8ff672f6a05..d150d9726064951df539fd1848a012dcbb797903 100644 (file)
 # 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 {[is_remote target]} {
-    # gdbserver prints the warning message but expect is parsing only the
-    # GDB output, not the gdbserver output.
-    return 0
-}
-
 standard_testfile
 
 if { [prepare_for_testing "failed to prepare" ${testfile}] } {
@@ -35,12 +29,58 @@ gdb_test "x/5w global_var_1" \
 gdb_test "x/5w global_var_2" \
     "$hex:\[ \t\]+Cannot access memory at address $hex"
 
-# Now try a find starting from each global.
-gdb_test "find global_var_0, global_var_2, 0xff" \
-    "warning: Unable to access $decimal bytes of target memory at $hex, halting search\.\r\nPattern not found."
 
-gdb_test "find global_var_1, global_var_2, 0xff" \
-    "warning: Unable to access $decimal bytes of target memory at $hex, halting search\.\r\nPattern not found."
+# Try a find starting from each global, expecting the search to fail
+# due to memory access failure.
+#
+# If EXPECT_WARNING is true, then expect the "Unable to access
+# ... halting search" warning before the "Pattern not found" output.
+# Otherwise, don't expect the warning.
+#
+# (EXPECT_WARNING is necessary because when testing with the RSP
+# against servers that support the remote search memory packet, GDB
+# does not print that "halting search" warning.  While there are
+# servers that do print the same warning message as GDB would if it
+# were in charge of the search (like GDBserver), we're only parsing
+# GDB's output here, not the server's output.  And while we could read
+# GDBserver's output from $inferior_spawn_id, having GDBserver print
+# the warnings on its terminal doesn't really help users.  Much better
+# would be to extend the remote protocol to let the server tell GDB
+# which memory range couldn't be accessed, and then let GDB print the
+# warning instead of the server.  See PR gdb/22293.)
+
+proc test_not_found {expect_warning} {
+    global decimal hex
+
+    if {$expect_warning} {
+       set halting_search_re \
+           "warning: Unable to access $decimal bytes of target memory at $hex, halting search\.\r\n"
+    } else {
+       set halting_search_re ""
+    }
 
-gdb_test "find global_var_2, (global_var_2 + 16), 0xff" \
-    "warning: Unable to access $decimal bytes of target memory at $hex, halting search\.\r\nPattern not found."
+    # Now try a find starting from each global.
+    gdb_test "find global_var_0, global_var_2, 0xff" \
+       "${halting_search_re}Pattern not found."
+
+    gdb_test "find global_var_1, global_var_2, 0xff" \
+       "${halting_search_re}Pattern not found."
+
+    gdb_test "find global_var_2, (global_var_2 + 16), 0xff" \
+       "${halting_search_re}Pattern not found."
+}
+
+# If testing with the RSP, also test with target-side search
+# acceleration disabled.  This serves as proxy for servers that don't
+# support the memory search packet, when testing with GDBserver.
+
+if {[target_info gdb_protocol] == "remote"
+    || [target_info gdb_protocol] == "extended-remote"} {
+    test_not_found 0
+    with_test_prefix "search-memory-packet off" {
+       gdb_test_no_output "set remote search-memory-packet off"
+       test_not_found 0
+    }
+} else {
+    test_not_found 1
+}