| # Copyright 2012-2021 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| standard_testfile |
| |
| if { [prepare_for_testing "failed to prepare" ${testfile}] } { |
| return -1 |
| } |
| |
| if ![runto breakpt] { |
| return -1 |
| } |
| |
| # Basic attempt to read memory from globals. |
| gdb_test "x/5w global_var_1" \ |
| "$hex:\[ \t\]+0\[ \t\]+0\[ \t\]+0\[ \t\]+0\r\n$hex:\[ \t\]+Cannot access memory at address $hex" |
| gdb_test "x/5w global_var_2" \ |
| "$hex:\[ \t\]+Cannot access memory at address $hex" |
| |
| |
| # 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 "" |
| } |
| |
| # 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 |
| } |