From patchwork Sun Sep 15 04:02:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 34525 Received: (qmail 128243 invoked by alias); 15 Sep 2019 04:02:44 -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 128230 invoked by uid 89); 15 Sep 2019 04:02:43 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=Catch, throughout, preprocessor X-HELO: mail-qk1-f193.google.com Received: from mail-qk1-f193.google.com (HELO mail-qk1-f193.google.com) (209.85.222.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 15 Sep 2019 04:02:41 +0000 Received: by mail-qk1-f193.google.com with SMTP id w2so9783391qkf.2 for ; Sat, 14 Sep 2019 21:02:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id; bh=CfssOTgmTNfcKwLpBHtDa37wXTO9uqj6yab7q5mQenI=; b=g65PWLvEJfL7kXz3nxfJcF05lkgdFophEEZVPmoi6U3GDW4FI3jR7ARF2qwnBdot0u YWvLiKf7HH28fTyOCIkpE5QiIIfiNXdk0SN226V5rtAPE1JmNdatk+zKAVmBWszzild/ 6cdfZwrxd47RanPtlRNCQ7lBgu1kIXdCx2UoRWiyTBdl6+qi/G1636EdmB515EYZN4UD j+h79gXXBdV4nutpLdZYC84FMvcwU9ELJv8NNp2Nwm5StRUKPy2XXX9SDaNDHHErtikV um3ueq8Ru4W8+m5BFOhVVRZxK6tSbghHn9Lr+w6Tyj4dt/YIBopjFECuxcgAanHyNyk2 +aRA== Return-Path: Received: from localhost ([207.253.95.5]) by smtp.gmail.com with ESMTPSA id f2sm14649265qkj.58.2019.09.14.21.02.38 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 14 Sep 2019 21:02:38 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH] gdb: Catch exceptions when accessing source cache Date: Sun, 15 Sep 2019 00:02:34 -0400 Message-Id: <20190915040234.25201-1-andrew.burgess@embecosm.com> X-IsSubscribed: yes The source_cache::get_line_charpos function can currently throw an exception if the source file is missing, which doesn't match the expected behaviour documented in the functions header file. The documented behaviour is to return false on failure, and this is how the function appears to be used throughout GDB. I spotted this in the 'info source' command, currently for a missing source file you'll see something like this: (gdb) info source Current source file is /path/to/src/file.c Compilation directory is /path/to/build/ /path/to/src/file.c: No such file or directory. (gdb) After this patch we see this: (gdb) info source Current source file is /path/to/src/file.c Compilation directory is /path/to/build/ Source language is c. Producer is COMPILER VERSION AND FLAGS. Compiled with DWARF 2 debugging format. Does not include preprocessor macro info. We don't currently indicate that the source file can't be found, and maybe that would be something worth adding in the future. gdb/ChangeLog: * source-cache.c (source_cache::get_line_charpos): Catch exceptions and return false, this matches the behaviour documented in the header file. gdb/testsuite/ChangeLog: * gdb.base/list-missing-source.exp: New file. --- gdb/ChangeLog | 6 +++ gdb/source-cache.c | 27 +++++++---- gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.base/list-missing-source.exp | 63 ++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 gdb/testsuite/gdb.base/list-missing-source.exp diff --git a/gdb/source-cache.c b/gdb/source-cache.c index 18e2be989b4..7a52ce9458e 100644 --- a/gdb/source-cache.c +++ b/gdb/source-cache.c @@ -231,19 +231,26 @@ bool source_cache::get_line_charpos (struct symtab *s, const std::vector **offsets) { - std::string fullname = symtab_to_fullname (s); + 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 ()); + } - auto iter = m_offset_cache.find (fullname); - if (iter == m_offset_cache.end ()) + *offsets = &iter->second; + return true; + } + catch (const gdb_exception_error &e) { - ensure (s); - iter = m_offset_cache.find (fullname); - /* cache_source_text ensured this was entered. */ - gdb_assert (iter != m_offset_cache.end ()); + return false; } - - *offsets = &iter->second; - return true; } /* A helper function that extracts the desired source lines from TEXT, diff --git a/gdb/testsuite/gdb.base/list-missing-source.exp b/gdb/testsuite/gdb.base/list-missing-source.exp new file mode 100644 index 00000000000..703603e7cb2 --- /dev/null +++ b/gdb/testsuite/gdb.base/list-missing-source.exp @@ -0,0 +1,63 @@ +# Copyright 2019 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This test checks how GDB handles missing source files around the +# 'list' and 'info source' commands. + +standard_testfile + +# Create a source file in the output directory. +set srcfile [standard_output_file main.c] +set fd [open "$srcfile" w] +puts $fd { +int +main () +{ + return 0; +} +} +close $fd + +# Compile the source file. +set options "debug" +if { [gdb_compile "${srcfile}" "${binfile}" \ + executable $options] != "" } { + untested "failed to compile" + return -1 +} + +# Now delete the source file. +file delete $srcfile + +# Now start GDB, run to main and try to list the source. +clean_restart ${binfile} + +if ![runto_main] then { + fail "can't run to main" + return 0 +} + +gdb_test "list" "1\[ \t\]+in\[ \t\]+$srcfile" + +gdb_test "info source" \ + [multi_line \ + "info source" \ + "Current source file is $srcfile" \ + "Compilation directory is \[^\n\r\]+" \ + "Source language is c." \ + "Producer is \[^\n\r\]+" \ + "Compiled with DWARF $decimal debugging format." \ + "Does not include preprocessor macro info." ] +