From patchwork Mon Jan 23 21:24:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Machado X-Patchwork-Id: 18993 Received: (qmail 87659 invoked by alias); 23 Jan 2017 21:24:58 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 84277 invoked by uid 89); 23 Jan 2017 21:24:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 23 Jan 2017 21:24:45 +0000 Received: from svr-orw-fem-03.mgc.mentorg.com ([147.34.97.39]) by relay1.mentorg.com with esmtp id 1cVm6W-0000HG-0u from Luis_Gustavo@mentor.com for gdb-patches@sourceware.org; Mon, 23 Jan 2017 13:24:44 -0800 Received: from Opsys.world.mentorg.com (147.34.91.1) by svr-orw-fem-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server id 14.3.224.2; Mon, 23 Jan 2017 13:24:43 -0800 From: Luis Machado To: Subject: [PATCH] Harden tests that deal with memory regions Date: Mon, 23 Jan 2017 15:24:40 -0600 Message-ID: <1485206680-4402-1-git-send-email-lgustavo@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes 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/gdb-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. OK? gdb/testsuite/ChangeLog: 2017-01-23 Luis Machado * lib/gdb-memory.exp: New file. * lib/gdb.exp: Load gdb-memory.exp * gdb.base/memattr.exp (delete_memory): Move proc to lib/gdb-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. --- gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp | 3 ++ gdb/testsuite/gdb.base/memattr.exp | 19 +++-------- gdb/testsuite/lib/gdb-memory.exp | 38 ++++++++++++++++++++++ gdb/testsuite/lib/gdb.exp | 1 + 4 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 gdb/testsuite/lib/gdb-memory.exp diff --git a/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp b/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp index 7c3bd46..e0c1a37 100644 --- a/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp +++ b/gdb/testsuite/gdb.base/breakpoint-in-ro-region.exp @@ -137,6 +137,9 @@ if ![get_function_bounds "main" main_lo main_hi] { return -1 } +# Delete all memory regions. +delete_memory_regions + # Manually create a read-only memory region that covers 'main'. gdb_test_no_output "mem $main_lo $main_hi ro" \ "create read-only mem region covering main" diff --git a/gdb/testsuite/gdb.base/memattr.exp b/gdb/testsuite/gdb.base/memattr.exp index 5e37187..74f5ce6 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 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,7 @@ proc region_fail { region } { # |--| PASS # |--- PASS -delete_memory +delete_memory_regions gdb_test_no_output "mem 0x30 0x60 ro" with_test_prefix "0x30 0x60" { region_fail "0x20 0x40" @@ -562,7 +553,7 @@ with_test_prefix "0x30 0x60" { # |--| PASS # |--| PASS -delete_memory +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-memory.exp b/gdb/testsuite/lib/gdb-memory.exp new file mode 100644 index 0000000..3377011 --- /dev/null +++ b/gdb/testsuite/lib/gdb-memory.exp @@ -0,0 +1,38 @@ +# Copyright 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 . + +# This file was written by Fred Fish. (fnf@cygnus.com) + +# Generic gdb subroutines that should work for any target. If these +# need to be modified for any target, it can be done with a variable +# or by passing arguments. + +# This file holds functions and data dealing with memory regions manipulation. + +# Deletes all the 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 $" { } + } +} + + diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 2ff5c22..8c64a28 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 gdb-memory.exp global GDB