From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 93098 invoked by alias); 10 Jan 2017 12:27:05 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 91481 invoked by uid 89); 10 Jan 2017 12:26:52 -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=troubles, 9818 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-pf0-f196.google.com Received: from mail-pf0-f196.google.com (HELO mail-pf0-f196.google.com) (209.85.192.196) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 10 Jan 2017 12:26:41 +0000 Received: by mail-pf0-f196.google.com with SMTP id f144so9893332pfa.2; Tue, 10 Jan 2017 04:26:41 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=z1iAnqcg7AD2uekZYVcuIGUP14iM7ALCyFSpkEKZHPM=; b=ktj3yZfsrZNfOM4tC3tnvYTwZFYqTKcmnXRPYM87/nJc7u85uq8vdwU/xqsyJzfGMt HctiQE/a2c6eZjftILqs18aWpGJif0wtED6Cmc59Natyx8Af8die/4adtnDJCPlG/TDH kWc5f5wCO2r+NE7KG1UKUbyaOQDLGNxbVvaUeOFerfPtYv6Y4ADk7wsvwt0G3TxChpdX O6p51WcFRXk8oKXvH++5uwp7kuGTzllUFiufPWwLXYWneZqOeatGETgTCnEYrKbEIEfR 3945yzPZeeY48MrqaDacdMexbIQ5uMe/1OSK99edxu1VMSz81S06DIW9prJku3GVhSN3 ED9w== X-Gm-Message-State: AIkVDXKZ3kqsoy7vo/8/zECp6Uku8GWK9VY0VH31FdkzuPFf3TkmTRidRh7BbEiGAtqs2w== X-Received: by 10.84.168.4 with SMTP id e4mr4629567plb.160.1484051199894; Tue, 10 Jan 2017 04:26:39 -0800 (PST) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id r26sm5450661pgd.42.2017.01.10.04.26.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 Jan 2017 04:26:39 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: binutils@sourceware.org, gdb-patches@sourceware.org Subject: [PATCH 8/8] Don't throw exception in dis_asm_memory_error Date: Tue, 10 Jan 2017 12:27:00 -0000 Message-Id: <1484051178-16013-9-git-send-email-yao.qi@linaro.org> In-Reply-To: <1484051178-16013-1-git-send-email-yao.qi@linaro.org> References: <1484051178-16013-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes X-SW-Source: 2017-01/txt/msg00152.txt.bz2 Hi, GDB calls some APIs from opcodes to do disassembly and provide some call backs. This model makes troubles on C++ exception unwinding, because GDB is a C++ program, and opcodes is still compiled as C. As we can see, frame #10 and #12 are C++, while #frame 11 is C, #10 0x0000000000544228 in memory_error (err=TARGET_XFER_E_IO, memaddr=) at ../../binutils-gdb/gdb/corefile.c:237 #11 0x00000000006b0a54 in print_insn_aarch64 (pc=0, info=0xffffffffeeb0) at ../../binutils-gdb/opcodes/aarch64-dis.c:3185 #12 0x0000000000553590 in gdb_pretty_print_insn (gdbarch=gdbarch@entry=0xbbceb0, uiout=uiout@entry=0xbc73d0, di=di@entry=0xffffffffeeb0, insn=0xffffffffed40, insn@entry=0xffffffffed90, flags=flags@entry=0, C++ exception unwinder can't go across frame #11 unless it has unwind table. However, C program on many architectures doesn't have it in default. As a result, GDB aborts, which is described in PR 20939. This is not the first time we see this kind of problem. We've had a commit 89525768cd086a0798a504c81fdf7ebcd4c904e1 "Propagate GDB/C++ exceptions across readline using sj/lj-based TRY/CATCH". We can fix the disassembly bug in a similar way, this is the option one. Since opcodes is built with gdb, we fix this problem in a different way as we did for the same issue with readline. Instead of throwing exception in dis_asm_memory_error, we record the failed memory address, and throw exception when GDB returns from opcodes disassemblers. gdb: 2017-01-10 Yao Qi PR gdb/20939 * disasm.c (gdb_disassembler::dis_asm_memory_error): Don't call memory_error, save memaddr instead. (gdb_disassembler::print_insn): If gdbarch_print_insn returns negative, cal memory_error. * disasm.h (gdb_disassembler) : New field. gdb/testsuite: 2017-01-10 Yao Qi * gdb.base/all-architectures.exp.in (do_arch_tests): Test disassemble on address 0. --- gdb/disasm.c | 12 ++++++++++-- gdb/disasm.h | 1 + gdb/testsuite/gdb.base/all-architectures.exp.in | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gdb/disasm.c b/gdb/disasm.c index e908199..aa00510 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -139,7 +139,10 @@ void gdb_disassembler::dis_asm_memory_error (int err, bfd_vma memaddr, struct disassemble_info *info) { - memory_error (TARGET_XFER_E_IO, memaddr); + gdb_disassembler *self + = static_cast(info->application_data); + + self->m_err_memaddr = memaddr; } /* Like print_address with slightly different parameters. */ @@ -955,7 +958,8 @@ fprintf_disasm (void *stream, const char *format, ...) gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file, di_read_memory_ftype func) - : m_gdbarch (gdbarch) + : m_gdbarch (gdbarch), + m_err_memaddr (0) { init_disassemble_info (&m_di, file, fprintf_disasm); m_di.flavour = bfd_target_unknown_flavour; @@ -981,8 +985,12 @@ gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch, int gdb_disassembler::print_insn (CORE_ADDR memaddr) { + m_err_memaddr = 0; + int length = gdbarch_print_insn (arch (), memaddr, &m_di); + if (length < 0) + memory_error (TARGET_XFER_E_IO, m_err_memaddr); return length; } diff --git a/gdb/disasm.h b/gdb/disasm.h index 5592cdb..9e89828 100644 --- a/gdb/disasm.h +++ b/gdb/disasm.h @@ -65,6 +65,7 @@ protected: private: struct gdbarch *m_gdbarch; + CORE_ADDR m_err_memaddr; static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr, unsigned int len, diff --git a/gdb/testsuite/gdb.base/all-architectures.exp.in b/gdb/testsuite/gdb.base/all-architectures.exp.in index c7615ac..50a615c 100644 --- a/gdb/testsuite/gdb.base/all-architectures.exp.in +++ b/gdb/testsuite/gdb.base/all-architectures.exp.in @@ -152,6 +152,9 @@ proc print_floats {} { proc do_arch_tests {} { print_floats + + gdb_test_internal "disassemble 0x0,+4" \ + "Cannot access memory at address 0x0" } # Given we can't change arch, osabi, endianness, etc. atomically, we -- 1.9.1