public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: Catch exceptions when accessing source cache
@ 2019-09-17 19:56 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2019-09-17 19:56 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=67f3ed6afef86d08ef9989cc251eac585e9ef9cf

commit 67f3ed6afef86d08ef9989cc251eac585e9ef9cf
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Sun Sep 8 00:05:22 2019 +0100

    gdb: Catch exceptions when accessing source cache
    
    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.

Diff:
---
 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(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index c564fce..c9be686 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-17  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* source-cache.c (source_cache::get_line_charpos): Catch
+	exceptions and return false, this matches the behaviour documented
+	in the header file.
+
 2019-09-17  Joel Brobecker  <brobecker@adacore.com>
 
 	* ada-tasks.c (info_task): Remove quoting of the task's name.
diff --git a/gdb/source-cache.c b/gdb/source-cache.c
index 18e2be9..7a52ce9 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<off_t> **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/ChangeLog b/gdb/testsuite/ChangeLog
index d04cff1..b9060ef 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2019-09-17  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.base/list-missing-source.exp: New file.
+
 2019-09-14  Tom de Vries  <tdevries@suse.de>
 
 	PR teststuite/24599
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 0000000..703603e
--- /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 <http://www.gnu.org/licenses/>.
+
+# 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." ]
+


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-09-17 19:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-17 19:56 [binutils-gdb] gdb: Catch exceptions when accessing source cache Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).