This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Harden tests that deal with memory regions


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e309aa6524f8becadf6f1b75060a74be4c221899

commit e309aa6524f8becadf6f1b75060a74be4c221899
Author: Luis Machado <lgustavo@codesourcery.com>
Date:   Thu Jan 26 13:51:09 2017 -0600

    Harden tests that deal with memory regions
    
    Exercising aarch64-elf with a custom debug stub i noticed a few failures in
    both gdb.base/breakpoint-in-ro-region.exp and gdb.base/memattr.exp:
    
    FAIL: gdb.base/breakpoint-in-ro-region.exp: create read-only mem region covering main
    FAIL: gdb.base/breakpoint-in-ro-region.exp: writing to read-only memory fails
    FAIL: gdb.base/breakpoint-in-ro-region.exp: inserting software breakpoint in read-only memory fails
    
    FAIL: gdb.base/memattr.exp: create mem region 1
    FAIL: gdb.base/memattr.exp: create mem region 2
    FAIL: gdb.base/memattr.exp: create mem region 3
    FAIL: gdb.base/memattr.exp: create mem region 4
    FAIL: gdb.base/memattr.exp: create mem region 5
    FAIL: gdb.base/memattr.exp: info mem (1)
    FAIL: gdb.base/memattr.exp: mem1 cannot be read
    FAIL: gdb.base/memattr.exp: mem2 cannot be written
    FAIL: gdb.base/memattr.exp: mem2 can be read
    FAIL: gdb.base/memattr.exp: disable mem 1
    FAIL: gdb.base/memattr.exp: mem 1 was disabled
    FAIL: gdb.base/memattr.exp: enable mem 1
    FAIL: gdb.base/memattr.exp: mem 1 was enabled
    FAIL: gdb.base/memattr.exp: disable mem 2 4
    FAIL: gdb.base/memattr.exp: mem 2 and 4 were disabled
    FAIL: gdb.base/memattr.exp: enable mem 2-4
    FAIL: gdb.base/memattr.exp: mem 2-4 were enabled
    FAIL: gdb.base/memattr.exp: mem 1 to 5 were disabled
    FAIL: gdb.base/memattr.exp: mem 1 to 5 were enabled
    FAIL: gdb.base/memattr.exp: delete mem 1
    FAIL: gdb.base/memattr.exp: mem 1 was deleted
    FAIL: gdb.base/memattr.exp: delete mem 2 4
    FAIL: gdb.base/memattr.exp: mem 2 and 4 were deleted
    FAIL: gdb.base/memattr.exp: mem 2-4 were deleted
    
    These failures don't show up with gdbserver or native gdb on Linux because
    they don't export any memory maps, therefore the vector of memory regions is
    empty.
    
    Outside of that scenario, we can't guarantee the absence of memory regions
    reported by the target upon a connection. In our particular target, we
    provide a memory map and the memory regions vector ceases to be empty.
    
    With a non-empty memory regions vector, manipulating memory regions will cause
    gdb to be more verbose and output text. For example:
    
    memattr.c:require_user_regions
    
      /* Otherwise, let the user know how to get back.  */
      if (from_tty)
        warning (_("Switching to manual control of memory regions; use "
    	       "\"mem auto\" to fetch regions from the target again."));
    
    memattr.c:create_mem_region
    
          if ((lo >= n->lo && (lo < n->hi || n->hi == 0))
    	  || (hi > n->lo && (hi <= n->hi || n->hi == 0))
    	  || (lo <= n->lo && ((hi >= n->hi && n->hi != 0) || hi == 0)))
    	{
    	  printf_unfiltered (_("overlapping memory region\n"));
    	  return;
    	}
    
    In my particular case i got both of the above messages.
    
    In order to fix this, i've moved the delete_memory proc from
    gdb.base/memattr.exp to a new file lib/memory.exp and made lib/gdb.exp
    load that file.
    
    For both gdb.base/breakpoint-in-ro-region.exp and gdb.base/memattr.exp the
    patch clears all existing memory regions after running to main. That way we
    are guaranteed to have a clean state for memory regions so the tests can
    exercise whatever they want and have an expected output pattern.
    
    Regression checked on x86-64/Ubuntu 16.04.
    
    gdb/testsuite/ChangeLog:
    
    2017-01-26  Luis Machado  <lgustavo@codesourcery.com>
    
    	* lib/memory.exp: New file.
    	* lib/gdb.exp: Load memory.exp.
    	* gdb.base/memattr.exp (delete_memory): Move proc to
    	lib/memory.exp and rename to delete_memory_regions.
    	Replace delete_memory with delete_memory_regions.
    	Cleanup memory regions before tests.
    	* gdb.base/breakpoint-in-ro-region.exp: Cleanup memory regions
    	before tests.

Diff:
---
 gdb/testsuite/ChangeLog                            | 11 ++++++++
 gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp |  3 ++
 gdb/testsuite/gdb.base/memattr.exp                 | 21 +++++---------
 gdb/testsuite/lib/gdb.exp                          |  1 +
 gdb/testsuite/lib/memory.exp                       | 33 ++++++++++++++++++++++
 5 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 16c549c..3427db8 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,16 @@
 2017-01-26  Luis Machado  <lgustavo@codesourcery.com>
 
+	* lib/memory.exp: New file.
+	* lib/gdb.exp: Load memory.exp.
+	* gdb.base/memattr.exp (delete_memory): Move proc to
+	lib/memory.exp and rename to delete_memory_regions.
+	Replace delete_memory with delete_memory_regions.
+	Cleanup memory regions before tests.
+	* gdb.base/breakpoint-in-ro-region.exp: Cleanup memory regions
+	before tests.
+
+2017-01-26  Luis Machado  <lgustavo@codesourcery.com>
+
 	* gdb.reverse/insn-reverse.c: Move arm and aarch64 code to their own
 	files.
 	(initialize): New function conditionally defined.
diff --git a/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp b/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp
index 7c3bd46..122b04d 100644
--- a/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp
+++ b/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp
@@ -25,6 +25,9 @@ if ![runto main] {
     return -1
 }
 
+# Delete all target-supplied memory regions.
+delete_memory_regions
+
 delete_breakpoints
 
 # Probe for hardware stepping.
diff --git a/gdb/testsuite/gdb.base/memattr.exp b/gdb/testsuite/gdb.base/memattr.exp
index 5e37187..48f0496 100644
--- a/gdb/testsuite/gdb.base/memattr.exp
+++ b/gdb/testsuite/gdb.base/memattr.exp
@@ -25,6 +25,9 @@ if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
 
 runto main
 
+# Delete all target-supplied memory regions.
+delete_memory_regions
+
 set mem1start -1
 set mem2start -1
 set mem3start -1
@@ -487,18 +490,6 @@ gdb_test "delete mem 8" "No memory region number 8." \
 # Test overlapping checking
 #
 
-proc delete_memory {} {
-    global gdb_prompt
-
-    gdb_test_multiple "delete mem" "delete mem" {
-       -re "Delete all memory regions.*y or n.*$" {
-           send_gdb "y\n"
-           exp_continue
-       }
-       -re "$gdb_prompt $" { }
-    }
-}
-
 # Create a region that doesn't overlap (a PASS in the table).
 
 proc region_pass { region } {
@@ -530,7 +521,8 @@ proc region_fail { region } {
 #                  |--|       PASS
 #                        |--- PASS
 
-delete_memory
+# Clear the memory regions list.
+delete_memory_regions
 gdb_test_no_output "mem 0x30 0x60 ro"
 with_test_prefix "0x30 0x60" {
     region_fail "0x20 0x40"
@@ -562,7 +554,8 @@ with_test_prefix "0x30 0x60" {
 #         |--|                PASS
 #   |--|                      PASS
 
-delete_memory
+# Clear the memory regions list.
+delete_memory_regions
 gdb_test_no_output "mem 0x30 0x0 ro"
 with_test_prefix "0x30 0x0" {
     region_fail "0x20 0x50"
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 2ff5c22..48bd7ee 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -28,6 +28,7 @@ if {$tool == ""} {
 load_lib libgloss.exp
 load_lib cache.exp
 load_lib gdb-utils.exp
+load_lib memory.exp
 
 global GDB
 
diff --git a/gdb/testsuite/lib/memory.exp b/gdb/testsuite/lib/memory.exp
new file mode 100644
index 0000000..62dd8ad
--- /dev/null
+++ b/gdb/testsuite/lib/memory.exp
@@ -0,0 +1,33 @@
+# Copyright 2012-2017 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/>.
+
+# This file holds functions and data dealing with memory checks and other memory
+# manipulation routines.
+
+# Deletes all memory regions GDB currently knows about.
+
+proc delete_memory_regions {} {
+    global gdb_prompt
+
+    gdb_test_multiple "delete mem" "delete mem" {
+       -re "Delete all memory regions.*y or n.*$" {
+           send_gdb "y\n"
+           exp_continue
+       }
+       -re "$gdb_prompt $" { }
+    }
+}
+
+


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]