From patchwork Tue Aug 11 14:30:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luis Machado X-Patchwork-Id: 8134 Received: (qmail 89775 invoked by alias); 11 Aug 2015 14:31:14 -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 89766 invoked by uid 89); 11 Aug 2015 14:31:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 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; Tue, 11 Aug 2015 14:31:11 +0000 Received: from svr-orw-fem-05.mgc.mentorg.com ([147.34.97.43]) by relay1.mentorg.com with esmtp id 1ZPAa4-0006oq-7g from Luis_Gustavo@mentor.com for gdb-patches@sourceware.org; Tue, 11 Aug 2015 07:31:08 -0700 Received: from opsys.world.mentorg.com (147.34.91.1) by svr-orw-fem-05.mgc.mentorg.com (147.34.97.43) with Microsoft SMTP Server id 14.3.224.2; Tue, 11 Aug 2015 07:31:07 -0700 From: Luis Machado To: Subject: [PATCH] [regression] Do not read from catchpoint/watchpoint locations' addresses when checking for a permanent breakpoint Date: Tue, 11 Aug 2015 11:30:44 -0300 Message-ID: <1439303444-720-1-git-send-email-lgustavo@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes While running bare-metal tests with GDB i noticed some failures in gdb.base/break.exp, related to the use of the catch commands. It turns out GDB tries to access memory address 0x0 whenever one tries to insert a catchpoint, which should obviously not happen. This was introduced with the changes for permanent breakpoints. In special, bp_loc_is_permanent tries to check if there is a breakpoint inserted at the same address as the current breakpoint's location's address. In the case of catchpoints, this is 0x0. (top-gdb) catch fork Sending packet: $m0,1#fa...Packet received: E01 Catchpoint 4 (fork) (top-gdb) catch vfork Sending packet: $m0,1#fa...Packet received: E01 Catchpoint 5 (vfork) It is not obvious to detect because this fails silently for Linux. For our bare-metal testing, though, this fails with a clear error message from the target about not being able to read such address. The attached patch addresses this by bailing out of bp_loc_is_permanent (...) if the location address is not meaningful. I also took the opportunity to update the comment for breakpoint_address_is_meaningful, which mentioned breakpoint addresses as opposed to their locations' addresses. Is this OK? Luis 2015-08-11 Luis Machado * breakpoint.c (bp_loc_is_permanent): Return 0 when breakpoint location address is not meaningful. (breakpoint_address_is_meaningful): Update comment. --- gdb/breakpoint.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 91a53b9..94f4ee6 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -6930,14 +6930,14 @@ describe_other_breakpoints (struct gdbarch *gdbarch, /* Return true iff it is meaningful to use the address member of - BPT. For some breakpoint types, the address member is irrelevant - and it makes no sense to attempt to compare it to other addresses - (or use it for any other purpose either). + BPT locations. For some breakpoint types, the locations' address members + are irrelevant and it makes no sense to attempt to compare it to other + addresses (or use it for any other purpose either). More specifically, each of the following breakpoint types will - always have a zero valued address and we don't want to mark + always have a zero valued location address and we don't want to mark breakpoints of any of these types to be a duplicate of an actual - breakpoint at address zero: + breakpoint location at address zero: bp_watchpoint bp_catchpoint @@ -8974,6 +8974,13 @@ bp_loc_is_permanent (struct bp_location *loc) gdb_assert (loc != NULL); + /* If we have a catchpoint or a watchpoint, just return 0. We should not + attempt to read from the addresses the locations of these breakpoint types + point to. program_breakpoint_here_p, below, will attempt to read + memory. */ + if (breakpoint_address_is_meaningful (loc->owner); + return 0; + cleanup = save_current_space_and_thread (); switch_to_program_space_and_thread (loc->pspace);