diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/source-cache.c | 27 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | 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." ] + |