From patchwork Fri Jan 10 11:57:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shahab Vahedi X-Patchwork-Id: 37283 Received: (qmail 116942 invoked by alias); 10 Jan 2020 11:57:52 -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 116578 invoked by uid 89); 10 Jan 2020 11:57:52 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=9765, HContent-Transfer-Encoding:8bit X-HELO: mail-lj1-f194.google.com Received: from mail-lj1-f194.google.com (HELO mail-lj1-f194.google.com) (209.85.208.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 10 Jan 2020 11:57:51 +0000 Received: by mail-lj1-f194.google.com with SMTP id u1so1855232ljk.7 for ; Fri, 10 Jan 2020 03:57:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=AfErpOj+v7hd7U+n3YwpFNuqeVg7mYJUy02A8p1rIFc=; b=e7SORPKWXoUFqLhuFaNvYgWrWZtOaPJ9+QotT1u7Dc9nTTPmWEzwEEYgZynuIhX6Nj RWhE22CJzOeNFb0oI53BYoK0dL9Pj2rCR10A2tlMvsB7Xd372sDKCBaeuNnkpoPNnjjl ipHWF0IsmnlXrs2RJw30BH//tV+nLlFXTjfuRIbEtoC18DRgkBGvL3fO0zMWpr+d+YOI r96utROCNxmpB0sfsRShoh3FJxJxnmLCZNYLw7diaSdpiECilDT18RTfx8ZztGFKOD2C A4dFI2pR9O0nvE/xrCH90zaajoQaoxAGGsIlc1yPOkV8kZmieEV5d5A3c0cnggAIJjte pcqg== Return-Path: Received: from archie.internal.synopsys.com ([2a03:1b20:6:f011::2d]) by smtp.gmail.com with ESMTPSA id n23sm916672lfa.41.2020.01.10.03.57.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jan 2020 03:57:47 -0800 (PST) From: Shahab Vahedi To: gdb-patches@sourceware.org Cc: Shahab Vahedi , Pedro Alves , Andrew Burgess , Tom Tromey , Claudiu Zissulescu , Francois Bedard Subject: [PATCH v2][PR tui/9765] Fix segfault in asm TUI when reaching end of file Date: Fri, 10 Jan 2020 12:57:28 +0100 Message-Id: <20200110115728.13940-1-shahab.vahedi@gmail.com> MIME-Version: 1.0 From: Shahab Vahedi In TUI mode, when the assembly layout reaches the end of a binary, GDB wants to disassemle the addresses beyond the last valid ones. This results in a "MEMORY_ERROR" exception to be thrown when tui_disasm_window::set_contents() invokes tui_disassemble(). When that happens set_contents() bails out prematurely without filling the "content" for the valid addresses. This eventually leads to no assembly lines or termination of GDB when you scroll down to the last lines of the program. With this change, tui_disassemble() catches MEMORY_ERROR exceptions and ignores them, while filling the rest of "asm_lines" with the same address (the one just beyond the last PC address). The issue has been discussed at length in bug 25345 (and 9765). gdb/ChangeLog: 2020-01-10 Shahab Vahedi PR tui/25345 * tui/tui-disasm.c (tui_disasm_window::tui_disassemble): Handle MEMORY_ERROR exceptions gracefully. --- The behavior of GDB after this fix is illustrated here: https://sourceware.org/bugzilla/attachment.cgi?id=12178 gdb/tui/tui-disasm.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index 98c691f3387..dffcd257a0d 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -114,7 +114,19 @@ tui_disassemble (struct gdbarch *gdbarch, asm_lines[pos + i].addr_size = new_size; } - pc = pc + gdb_print_insn (gdbarch, pc, &gdb_dis_out, NULL); + try + { + pc = pc + gdb_print_insn (gdbarch, pc, &gdb_dis_out, NULL); + } + catch (const gdb_exception &except) + { + /* In cases where max_lines is asking tui_disassemble() to fetch + too much, like when PC goes past the valid address range, a + MEMORY_ERROR is thrown, but it is alright. */ + if (except.error != MEMORY_ERROR) + throw; + /* fall through: let asm_lines still to be filled. */ + } asm_lines[pos + i].insn = std::move (gdb_dis_out.string ());