From b3dc46ff7cf43135228173839e4c7985b1cc2bb3 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Mon, 1 Oct 2012 12:02:13 +0000 Subject: [PATCH] http://sourceware.org/ml/gdb-patches/2012-09/msg00568.html gdb/ChangeLog * target.c (simple_search_memory): Include access length in warning message. gdb/gdbserver/ChangeLog * server.c (handle_search_memory_1): Include access length in warning message. gdb/testsuite/ChangeLog Test find command on unmapped memory. * gdb.base/find-unmapped.c: New file. * gdb.base/find-unmapped.exp: New file. --- gdb/ChangeLog | 5 ++ gdb/gdbserver/ChangeLog | 5 ++ gdb/gdbserver/server.c | 9 +- gdb/target.c | 8 +- gdb/testsuite/ChangeLog | 6 ++ gdb/testsuite/gdb.base/find-unmapped.c | 106 +++++++++++++++++++++++ gdb/testsuite/gdb.base/find-unmapped.exp | 46 ++++++++++ 7 files changed, 178 insertions(+), 7 deletions(-) create mode 100644 gdb/testsuite/gdb.base/find-unmapped.c create mode 100644 gdb/testsuite/gdb.base/find-unmapped.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b5aeda17f0..20631b52d3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-10-01 Andrew Burgess + + * target.c (simple_search_memory): Include access length in + warning message. + 2012-09-28 Nathan Miller Edjunior Machado diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 672a87df9f..8bfbe9cb51 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2012-10-01 Andrew Burgess + + * server.c (handle_search_memory_1): Include access length in + warning message. + 2012-09-05 Michael Brandt * linux-crisv32-low.c: Fix compile errors. diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 547552f94d..61a7313041 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -735,8 +735,9 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len, if (gdb_read_memory (start_addr, search_buf, search_buf_size) != search_buf_size) { - warning ("Unable to access target memory at 0x%lx, halting search.", - (long) start_addr); + warning ("Unable to access %ld bytes of target " + "memory at 0x%lx, halting search.", + (long) search_buf_size, (long) start_addr); return -1; } @@ -787,9 +788,9 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len, if (gdb_read_memory (read_addr, search_buf + keep_len, nr_to_read) != search_buf_size) { - warning ("Unable to access target memory " + warning ("Unable to access %ld bytes of target memory " "at 0x%lx, halting search.", - (long) read_addr); + (long) nr_to_read, (long) read_addr); return -1; } diff --git a/gdb/target.c b/gdb/target.c index 1fc8802841..861e6a62c7 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2874,8 +2874,9 @@ simple_search_memory (struct target_ops *ops, if (target_read (ops, TARGET_OBJECT_MEMORY, NULL, search_buf, start_addr, search_buf_size) != search_buf_size) { - warning (_("Unable to access target memory at %s, halting search."), - hex_string (start_addr)); + warning (_("Unable to access %s bytes of target " + "memory at %s, halting search."), + pulongest (search_buf_size), hex_string (start_addr)); do_cleanups (old_cleanups); return -1; } @@ -2928,8 +2929,9 @@ simple_search_memory (struct target_ops *ops, search_buf + keep_len, read_addr, nr_to_read) != nr_to_read) { - warning (_("Unable to access target " + warning (_("Unable to access %s bytes of target " "memory at %s, halting search."), + plongest (nr_to_read), hex_string (read_addr)); do_cleanups (old_cleanups); return -1; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 841341581c..1971810e20 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-10-01 Andrew Burgess + + Test find command on unmapped memory. + * gdb.base/find-unmapped.c: New file. + * gdb.base/find-unmapped.exp: New file. + 2012-09-29 Yao Qi * gdb.trace/mi-tracepoint-changed.exp: New. diff --git a/gdb/testsuite/gdb.base/find-unmapped.c b/gdb/testsuite/gdb.base/find-unmapped.c new file mode 100644 index 0000000000..e63dc99a94 --- /dev/null +++ b/gdb/testsuite/gdb.base/find-unmapped.c @@ -0,0 +1,106 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012 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 . */ + +#include +#include +#include +#include +#include + +#define CHUNK_SIZE 16000 /* same as findcmd.c's */ + +void *global_var_0; +void *global_var_1; +void *global_var_2; + +void +breakpt () +{ + /* Nothing. */ +} + +int +main (void) +{ + void *p; + size_t pg_size; + int pg_count; + void *unmapped_page, *last_mapped_page, *first_mapped_page; + + /* + Map enough pages to cover at least CHUNK_SIZE, and one extra page. We + then unmap the last page. + + From gdb we can then perform find commands into unmapped region, gdb + should give an error. + + .-- global_var_0 .-- global_var_1 + | | .-- global_var_2 + | | | + .----.----.----.----.----. + | | | | | | + '----'----'----'----'----' + |<- CHUNK_SIZE ->| + + If CHUNK_SIZE equals page size then we'll get 3 pages, and if + CHUNK_SIZE is less than page size we'll get 2 pages. The test will + still work in these cases. + + (1) We do a find from global_var_0 to global_var_2, this will fail when + loading the second chunk, as we know at least CHUNK_SIZE bytes are in + mapped space. + + (2) We do a find from global_var_1 to global_var_2, this will fail when + loading the first chunk, assuming the CHUNK_SIZE is at least 16 bytes. + + (3) We do a find from global_var_2 to (global_var_2 + 16), this too + will fail when loading the first chunk regardless of the chunk size. + */ + + pg_size = getpagesize (); + /* The +2 ensures the extra page. */ + pg_count = CHUNK_SIZE / pg_size + 2; + + p = mmap (0, pg_count * pg_size, PROT_READ|PROT_WRITE, + MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + if (p == MAP_FAILED) + { + perror ("mmap"); + return EXIT_FAILURE; + } + + memset (p, 0, pg_count * pg_size); + + if (munmap (p + (pg_count - 1) * pg_size, pg_size) == -1) + { + perror ("munmap"); + return EXIT_FAILURE; + } + + first_mapped_page = p; + last_mapped_page = p + (pg_count - 2) * pg_size; + unmapped_page = last_mapped_page + pg_size; + + /* Setup global variables we reference from gdb. */ + global_var_0 = first_mapped_page; + global_var_1 = unmapped_page - 16; + global_var_2 = unmapped_page + 16; + + breakpt (); + + return EXIT_SUCCESS; +} diff --git a/gdb/testsuite/gdb.base/find-unmapped.exp b/gdb/testsuite/gdb.base/find-unmapped.exp new file mode 100644 index 0000000000..66907e2e06 --- /dev/null +++ b/gdb/testsuite/gdb.base/find-unmapped.exp @@ -0,0 +1,46 @@ +# Copyright 2012 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 . + +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 ${testfile}.exp ${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" + +# 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." + +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." -- 2.34.1