From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 120973 invoked by alias); 22 Jan 2020 15:49:07 -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 120958 invoked by uid 89); 22 Jan 2020 15:49:07 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Spam-Relays-External:209.85.128.67, H*RU:209.85.128.67 X-HELO: mail-wm1-f67.google.com Received: from mail-wm1-f67.google.com (HELO mail-wm1-f67.google.com) (209.85.128.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 22 Jan 2020 15:49:05 +0000 Received: by mail-wm1-f67.google.com with SMTP id a5so7337127wmb.0 for ; Wed, 22 Jan 2020 07:49:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=kbZnohZhD9bCon/oHUDLJgL+VwT6xbmtsPavHnbkLao=; b=REXTb0PhjCTKYW8yGcG3Wn8cA8tLXZPR5toXSmJqECHLk3mVbGjM7ephgWoHZmgLgI EObiwJCwAx/iHgfG7L30yB2UMvMl5O2Zmd5sQDK9xzmDhFSxJbJ8IiU40blQr6Dk93TO xweVupo5iiHOiByDS5rZGBIcmjpWOI9oGQshkr/qLzOzlHbLSstAionEJ/+Oel3muokc xkLR738HEjMDP86OfYGCv+mS0YLNSXoqwbsXf71rq0rXtKXciuJD83Kba5w0LT7rNSYZ wJLIwUOHn5JeDjjH8R01AcpCzoKeHd+xUuia3Chl3ffEHKxEnhkhQUyLw6eXAeXkoDae jbRA== Return-Path: Received: from localhost (host86-191-239-73.range86-191.btcentralplus.com. [86.191.239.73]) by smtp.gmail.com with ESMTPSA id w8sm5007120wmm.0.2020.01.22.07.49.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 22 Jan 2020 07:49:01 -0800 (PST) Date: Wed, 22 Jan 2020 16:24:00 -0000 From: Andrew Burgess To: Shahab Vahedi Cc: gdb-patches@sourceware.org, Shahab Vahedi , Tom Tromey , Claudiu Zissulescu , Francois Bedard Subject: Re: [PATCH] gdb: Catch exceptions if the source file is not found Message-ID: <20200122154901.GK3865@embecosm.com> References: <20200122140818.84308-1-shahab.vahedi@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200122140818.84308-1-shahab.vahedi@gmail.com> X-Fortune: Nothing increases your golf score like witnesses. X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes X-SW-Source: 2020-01/txt/msg00679.txt.bz2 * Shahab Vahedi [2020-01-22 15:08:18 +0100]: > From: Shahab Vahedi > > The source_cache::ensure method may throw an exception through > the invocation of source_cache::get_plain_source_lines. This > happens when the source file is not found. The expected behaviour > of "ensure" is only returning "true" or "false" according to the > documentation in the header file. > > So far, if gdb is in source layout and a file is missing, you see > some outputs like below: > > ,---------------------------------------------. > | test.c file is loaded in the source window. | > | | > | int main() | > | ... | > |---------------------------------------------| > | Remote debugging using :1234 | > | __start () at /path/to/crt0.S:141 | > | /path/to/crt0.S: No such file or directory. | > | (gdb) p/x $pc | > | $1 = 0x124 | > | (gdb) n | > | /path/to/crt0.S: No such file or directory. | > | (gdb) p/x $pc | > | $2 = 0x128 | > | (gdb) [pressing arrow-down key] | > | (gdb) terminate called after throwing an | > | instance of 'gdb_exception_error' | > `---------------------------------------------' > Other issues have been encountered as well [2]. > > The patch from Pedro [1] which is about preventing exceptions > from crossing the "readline" mitigates the situation by not > causing gdb crash, but still there are lots of errors printed: > > ,---------------------------------------------. > | test.c file is loaded in the source window. | > | | > | int main() | > | ... | > |---------------------------------------------| > | Remote debugging using :1234 | > | __start () at /path/to/crt0.S:141 | > | /path/to/crt0.S: No such file or directory. | > | (gdb) [pressing arrow-down key] | > | /path/to/crt0.S: No such file or directory. | > | (gdb) [pressing arrow-down key] | > | /path/to/crt0.S: No such file or directory. | > | (gdb) [pressing arrow-up key] | > | /path/to/crt0.S: No such file or directory. | > `---------------------------------------------' > > With the changes of this patch, the behavior is like: > ,---------------------------------------------. > | initially, source window is empty because | > | crt0.S is not found and according to the | > | program counter that is the piece of code | > | being executed. | > | | > | later, when we break at main (see commands | > | below), this window will be filled with the | > | the contents of test.c file. | > |---------------------------------------------| > | Remote debugging using :1234 | > | __start () at /path/to/crt0.S:141 | > | (gdb) p/x $pc | > | $1 = 0x124 | > | (gdb) n | > | (gdb) p/x $pc | > | $2 = 0x128 | > | (gdb) b main | > | Breakpoint 1 at 0x334: file test.c, line 8. | > | (gdb) cont | > | Continuing. | > | Breakpoint 1, main () at hello.c:8 | > | (gdb) n | > | (gdb) | > `---------------------------------------------' > > There is no crash and the error message is completely > gone. Maybe it is good practice that the error is > shown inside the source window. > > I tested this change against gdb.base/list-missing-source.exp > and there was no regression. Would it be possible to create a version of this test (or similar) within gdb.tui/ so this fix would be protected in the future? Thanks, Andrew > > [1] > https://sourceware.org/ml/gdb-patches/2020-01/msg00440.html > > [2] > It has also been observed in the past that the register > values are not transferred from qemu's gdb stub, see: > https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/issues/226 > > gdb/ChangeLog: > 2020-01-22 Shahab Vahedi > > * source-cache.c (source_cache::ensure): Surround > get_plain_source_lines with a try/catch. > (source_cache::get_line_charpos): Get rid of try/catch > and only check for the return value of "ensure". > --- > gdb/source-cache.c | 39 +++++++++++++++++++++------------------ > 1 file changed, 21 insertions(+), 18 deletions(-) > > diff --git a/gdb/source-cache.c b/gdb/source-cache.c > index 71277ecc9b3..9196e3a19e3 100644 > --- a/gdb/source-cache.c > +++ b/gdb/source-cache.c > @@ -176,7 +176,16 @@ source_cache::ensure (struct symtab *s) > } > } > > - std::string contents = get_plain_source_lines (s, fullname); > + std::string contents; > + try > + { > + contents = get_plain_source_lines (s, fullname); > + } > + catch (const gdb_exception_error &e) > + { > + /* If 's' is not found, an exception is thrown. */ > + return false; > + } > > if (source_styling && gdb_stdout->can_emit_style_escape ()) > { > @@ -241,26 +250,20 @@ bool > source_cache::get_line_charpos (struct symtab *s, > const std::vector **offsets) > { > - try > - { > - std::string fullname = symtab_to_fullname (s); > - > - auto iter = m_offset_cache.find (fullname); > - if (iter == m_offset_cache.end ()) > - { > - ensure (s); > - iter = m_offset_cache.find (fullname); > - /* cache_source_text ensured this was entered. */ > - gdb_assert (iter != m_offset_cache.end ()); > - } > + std::string fullname = symtab_to_fullname (s); > > - *offsets = &iter->second; > - return true; > - } > - catch (const gdb_exception_error &e) > + auto iter = m_offset_cache.find (fullname); > + if (iter == m_offset_cache.end ()) > { > - return false; > + if (!ensure (s)) > + return false; > + iter = m_offset_cache.find (fullname); > + /* cache_source_text ensured this was entered. */ > + gdb_assert (iter != m_offset_cache.end ()); > } > + > + *offsets = &iter->second; > + return true; > } > > /* A helper function that extracts the desired source lines from TEXT, > -- > 2.25.0 >