From patchwork Tue Apr 19 07:50:20 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 11801 Received: (qmail 87458 invoked by alias); 19 Apr 2016 07:50:56 -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 86966 invoked by uid 89); 19 Apr 2016 07:50:54 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-pf0-f178.google.com Received: from mail-pf0-f178.google.com (HELO mail-pf0-f178.google.com) (209.85.192.178) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 19 Apr 2016 07:50:43 +0000 Received: by mail-pf0-f178.google.com with SMTP id n1so4290233pfn.2 for ; Tue, 19 Apr 2016 00:50:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Al9UxuWZpSUILrVjUBzSBRDnw+7yFAiYJdhsr7LMS8Q=; b=CHpRv5P+fDVlYGiNSbyC7xOR6L314Q1ItfeTfQ2RBjHbSNhfWjtaJeJSa2yHvYatQ/ +yWIB/i7EBw0dfjk+W9rUEUNSHVsUoi19iFiE89GWcriXkuMH2PgFyy9i6E45s/s5Gke 583/IeJMYkncdkHFq0Q/CByjoigGNSBR97XJEjvAyOfMWYACHCR+t097dsZ+4jMg7pWM 1/hG7F941tLLyQhABTyEvzmzRjBWAbaOKh7K4QjwZ+6nVOSvBIaszMo/zD2AeMb8C5PP q0i4Q5ztXglwmFWsJ708EFV2BADvuufKJtF31WTrFjYBYkP2VNEcE8t9Y9kH8LGPVxFt vmlw== X-Gm-Message-State: AOPr4FVpsrDNRreCkPDpKfjPHHuJ5vNTsR2qScImUzq5MfC7f3tY/gShzTj0bGAXdgdPzQ== X-Received: by 10.98.95.4 with SMTP id t4mr2088286pfb.100.1461052241887; Tue, 19 Apr 2016 00:50:41 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id p128sm10125574pfp.59.2016.04.19.00.50.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 19 Apr 2016 00:50:41 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 2/2] Throw NOT_AVAILABLE_ERROR in read_stack and read_code Date: Tue, 19 Apr 2016 08:50:20 +0100 Message-Id: <1461052220-10149-3-git-send-email-yao.qi@linaro.org> In-Reply-To: <1461052220-10149-1-git-send-email-yao.qi@linaro.org> References: <1461052220-10149-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes Nowadays, read_memory may throw NOT_AVAILABLE_ERROR (it is done by patch http://sourceware.org/ml/gdb-patches/2013-08/msg00625.html) however, read_stack and read_code still throws MEMORY_ERROR only. This causes PR 19947, that is prologue unwinder is unable unwind because code memory isn't available, but MEMORY_ERROR is thrown, while unwinder catches NOT_AVAILABLE_ERROR. #0 memory_error (err=err@entry=TARGET_XFER_E_IO, memaddr=memaddr@entry=140737349781158) at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:217 #1 0x000000000065f5ba in read_code (memaddr=memaddr@entry=140737349781158, myaddr=myaddr@entry=0x7fffffffd7b0 "\340\023<\001", len=len@entry=1) at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:288 #2 0x000000000065f7b5 in read_code_unsigned_integer (memaddr=memaddr@entry=140737349781158, len=len@entry=1, byte_order=byte_order@entry=BFD_ENDIAN_LITTLE) at /home/yao/SourceCode/gnu/gdb/git/gdb/corefile.c:363 #3 0x00000000004717e0 in amd64_analyze_prologue (gdbarch=gdbarch@entry=0x13c13e0, pc=140737349781158, current_pc=140737349781165, cache=cache@entry=0xda0cb0) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2267 #4 0x0000000000471f6d in amd64_frame_cache_1 (cache=0xda0cb0, this_frame=0xda0bf0) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2437 #5 amd64_frame_cache (this_frame=0xda0bf0, this_cache=) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2508 #6 0x000000000047214d in amd64_frame_this_id (this_frame=, this_cache=, this_id=0xda0c50) at /home/yao/SourceCode/gnu/gdb/git/gdb/amd64-tdep.c:2541 #7 0x00000000006b94c4 in compute_frame_id (fi=0xda0bf0) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:481 #8 get_prev_frame_if_no_cycle (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1809 #9 0x00000000006bb6c9 in get_prev_frame_always_1 (this_frame=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1983 #10 get_prev_frame_always (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1999 #11 0x00000000006bbe11 in get_prev_frame (this_frame=this_frame@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:2241 #12 0x00000000006bc13c in unwind_to_current_frame (ui_out=, args=args@entry=0xda0b20) at /home/yao/SourceCode/gnu/gdb/git/gdb/frame.c:1485 The fix is to let read_stack and read_code throw NOT_AVAILABLE_ERROR too, in order to align with read_memory. gdb: 2016-04-18 Yao Qi PR gdb/19947 * corefile.c (read_memory): Rename it to ... (read_memory_object): ... it. Add parameter object. (read_memory): Call read_memory_object. (read_stack): Likewise. (read_code): Likewise. --- gdb/corefile.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/gdb/corefile.c b/gdb/corefile.c index 5ad4d40..6cc2afc 100644 --- a/gdb/corefile.c +++ b/gdb/corefile.c @@ -237,10 +237,11 @@ memory_error (enum target_xfer_status err, CORE_ADDR memaddr) throw_error (exception, ("%s"), str); } -/* Same as target_read_memory, but report an error if can't read. */ +/* Helper function. */ -void -read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) +static void +read_memory_object (enum target_object object, CORE_ADDR memaddr, + gdb_byte *myaddr, ssize_t len) { ULONGEST xfered = 0; @@ -250,7 +251,7 @@ read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) ULONGEST xfered_len; status = target_xfer_partial (current_target.beneath, - TARGET_OBJECT_MEMORY, NULL, + object, NULL, myaddr + xfered, NULL, memaddr + xfered, len - xfered, &xfered_len); @@ -264,16 +265,20 @@ read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) } } +/* Same as target_read_memory, but report an error if can't read. */ + +void +read_memory (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) +{ + read_memory_object (TARGET_OBJECT_MEMORY, memaddr, myaddr, len); +} + /* Same as target_read_stack, but report an error if can't read. */ void read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) { - int status; - - status = target_read_stack (memaddr, myaddr, len); - if (status != 0) - memory_error (TARGET_XFER_E_IO, memaddr); + read_memory_object (TARGET_OBJECT_STACK_MEMORY, memaddr, myaddr, len); } /* Same as target_read_code, but report an error if can't read. */ @@ -281,11 +286,7 @@ read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) void read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) { - int status; - - status = target_read_code (memaddr, myaddr, len); - if (status != 0) - memory_error (TARGET_XFER_E_IO, memaddr); + read_memory_object (TARGET_OBJECT_CODE_MEMORY, memaddr, myaddr, len); } /* Read memory at MEMADDR of length LEN and put the contents in