aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2018-04-26 16:21:34 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-09-27 11:31:35 +0100
commitfde1a9a3ee8c95bb7bae6c764755bcbffdbb0308 (patch)
tree7a4913567f8c8ede1e6f43d11fa1f2183fe386b1
parent5cf3b309489d1606ee0fb7e452f467d82fd1b765 (diff)
downloadfsf-binutils-gdb-fde1a9a3ee8c95bb7bae6c764755bcbffdbb0308.zip
fsf-binutils-gdb-fde1a9a3ee8c95bb7bae6c764755bcbffdbb0308.tar.gz
fsf-binutils-gdb-fde1a9a3ee8c95bb7bae6c764755bcbffdbb0308.tar.bz2
gdb: add setting to disable reading source code files
In some situations it is possible that a user might not want GDB to try and access source code files, for example, the source code might be stored on a slow to access network file system. It is almost certainly possible that using some combination of 'set directories' and/or 'set substitute-path' a user can trick GDB into being unable to find the source files, but this feels like a rather crude way to solve the problem. In this commit a new option is add that stops GDB from opening and reading the source files. A user can run with source code reading disabled if this is required, then re-enable later if they decide that they now want to view the source code.
-rw-r--r--gdb/NEWS9
-rw-r--r--gdb/cli/cli-cmds.c4
-rw-r--r--gdb/cli/cli-cmds.h8
-rw-r--r--gdb/doc/gdb.texinfo26
-rw-r--r--gdb/source.c66
-rw-r--r--gdb/testsuite/gdb.base/source-open.c25
-rw-r--r--gdb/testsuite/gdb.base/source-open.exp44
7 files changed, 179 insertions, 3 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index f948552..d7c29c8 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,8 @@
*** Changes since GDB 11
+* New commands
+
maint set backtrace-on-fatal-signal on|off
maint show backtrace-on-fatal-signal
This setting is 'on' by default. When 'on' GDB will print a limited
@@ -10,6 +12,13 @@ maint show backtrace-on-fatal-signal
fatal signal. This only supported on some platforms where the
backtrace and backtrace_symbols_fd functions are available.
+set source open on|off
+show source open
+ This setting, which is on by default, controls whether GDB will try
+ to open source code files. Switching this off will stop GDB trying
+ to open and read source code files, which can be useful if the files
+ are located over a slow network connection.
+
* Python API
** New function gdb.add_history(), which takes a gdb.Value object
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 5ff0b77..e5c7152 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -168,6 +168,10 @@ struct cmd_list_element *setchecklist;
struct cmd_list_element *showchecklist;
+struct cmd_list_element *setsourcelist;
+
+struct cmd_list_element *showsourcelist;
+
/* Command tracing state. */
int source_verbose = 0;
diff --git a/gdb/cli/cli-cmds.h b/gdb/cli/cli-cmds.h
index ce2e3888..a4b4168 100644
--- a/gdb/cli/cli-cmds.h
+++ b/gdb/cli/cli-cmds.h
@@ -137,6 +137,14 @@ extern struct cmd_list_element *showchecklist;
extern struct cmd_list_element *save_cmdlist;
+/* Chain containing all defined "set source" subcommands. */
+
+extern struct cmd_list_element *setsourcelist;
+
+/* Chain containing all defined "show source" subcommands. */
+
+extern struct cmd_list_element *showsourcelist;
+
/* Limit the call depth of user-defined commands */
extern unsigned int max_user_call_depth;
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index bf731a1..fcfdc26 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -8919,6 +8919,7 @@ prefer to use Emacs facilities to view source; see @ref{Emacs, ,Using
* Search:: Searching source files
* Source Path:: Specifying source directories
* Machine Code:: Source and machine code
+* Disable Reading Source:: Disable Reading Source Code
@end menu
@node List
@@ -9926,6 +9927,31 @@ OFF, which means never display the disassembly of the next line or
instruction.
@end table
+@node Disable Reading Source
+@section Disable Reading Source Code
+@cindex source code, disable access
+
+In some cases it can be desirable to prevent @value{GDBN} from
+accessing source code files. One case where this might be desirable
+is if the source code files are located over a slow network
+connection.
+
+The following command can be used to control whether @value{GDBN}
+should access source code files or not:
+
+@table @code
+@kindex set source open
+@kindex show source open
+@item set source open @r{[}on@r{|}off@r{]}
+@itemx show source open
+When this option is @code{on}, which is the default, @value{GDBN} will
+access source code files when needed, for example to print source
+lines when @value{GDBN} stops, or in response to the @code{list}
+command.
+
+When this option is @code{off}, @value{GDBN} will not access source
+code files.
+@end table
@node Data
@chapter Examining Data
diff --git a/gdb/source.c b/gdb/source.c
index 7d1934b..eec6e77 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -148,7 +148,21 @@ show_filename_display_string (struct ui_file *file, int from_tty,
{
fprintf_filtered (file, _("Filenames are displayed as \"%s\".\n"), value);
}
-
+
+/* When true GDB will stat and open source files as required, but when
+ false, GDB will avoid accessing source files as much as possible. */
+
+static bool source_open = true;
+
+/* Implement 'show source open'. */
+
+static void
+show_source_open (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("Source opening is \"%s\".\n"), value);
+}
+
/* Line number of last line printed. Default for various commands.
current_source_line is usually, but not always, the same as this. */
@@ -1048,8 +1062,13 @@ find_and_open_source (const char *filename,
const char *p;
int result;
- /* Quick way out if we already know its full name. */
+ /* If reading of source files is disabled then return a result indicating
+ the attempt to read this source file failed. GDB will then display
+ the filename and line number instead. */
+ if (!source_open)
+ return scoped_fd (-1);
+ /* Quick way out if we already know its full name. */
if (*fullname)
{
/* The user may have requested that source paths be rewritten
@@ -1062,6 +1081,7 @@ find_and_open_source (const char *filename,
*fullname = std::move (rewritten_fullname);
result = gdb_open_cloexec (fullname->get (), OPEN_MODE, 0);
+
if (result >= 0)
{
*fullname = gdb_realpath (fullname->get ());
@@ -1300,7 +1320,7 @@ print_source_lines_base (struct symtab *s, int line, int stopline,
/* If printing of source lines is disabled, just print file and line
number. */
- if (uiout->test_flags (ui_source_list))
+ if (uiout->test_flags (ui_source_list) && source_open)
{
/* Only prints "No such file or directory" once. */
if (s == last_source_visited)
@@ -1603,6 +1623,9 @@ search_command_helper (const char *regex, int from_tty, bool forward)
if (loc->symtab () == nullptr)
select_source_symtab (0);
+ if (!source_open)
+ error (_("source code access disabled"));
+
scoped_fd desc (open_source_file (loc->symtab ()));
if (desc.get () < 0)
perror_with_name (symtab_to_filename_for_display (loc->symtab ()));
@@ -1927,6 +1950,22 @@ source_lines_range::source_lines_range (int startline,
}
}
+/* Handle the "set source" base command. */
+
+static void
+set_source (const char *arg, int from_tty)
+{
+ help_list (setsourcelist, "set source ", all_commands, gdb_stdout);
+}
+
+/* Handle the "show source" base command. */
+
+static void
+show_source (const char *args, int from_tty)
+{
+ help_list (showsourcelist, "show source ", all_commands, gdb_stdout);
+}
+
void _initialize_source ();
void
@@ -2050,4 +2089,25 @@ By default, relative filenames are displayed."),
show_filename_display_string,
&setlist, &showlist);
+ add_prefix_cmd ("source", no_class, set_source,
+ _("Generic command for setting how sources are handled."),
+ &setsourcelist, 0, &setlist);
+
+ add_prefix_cmd ("source", no_class, show_source,
+ _("Generic command for showing source settings."),
+ &showsourcelist, 0, &showlist);
+
+ add_setshow_boolean_cmd ("open", class_files, &source_open, _("\
+Set whether GDB should open source files."), _("\
+Show whether GDB should open source files."), _("\
+When this option is on GDB will open source files and display the\n\
+contents when appropriate, for example, when GDB stops, or the list\n\
+command is used.\n\
+When this option is off GDB will not try to open source files, instead\n\
+GDB will print the file and line number that would have been displayed.\n\
+This can be useful if access to source code files is slow, for example\n\
+due to the source being located over a slow network connection."),
+ NULL,
+ show_source_open,
+ &setsourcelist, &showsourcelist);
}
diff --git a/gdb/testsuite/gdb.base/source-open.c b/gdb/testsuite/gdb.base/source-open.c
new file mode 100644
index 0000000..1fb5edb
--- /dev/null
+++ b/gdb/testsuite/gdb.base/source-open.c
@@ -0,0 +1,25 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2021 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/>. */
+
+#include <stdio.h>
+
+int
+main (int argc, char* argv[])
+{
+ printf ("source code line.");
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/source-open.exp b/gdb/testsuite/gdb.base/source-open.exp
new file mode 100644
index 0000000..eb80142
--- /dev/null
+++ b/gdb/testsuite/gdb.base/source-open.exp
@@ -0,0 +1,44 @@
+# Copyright 2021 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/>.
+
+# Test the 'set source open on|off' command.
+
+standard_testfile
+
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+ return -1
+}
+
+gdb_test "show source open" "Source opening is \"on\"\\." \
+ "source opening is initially on"
+gdb_test_no_output "set listsize 1"
+gdb_test_no_output "set source open on"
+gdb_test "list 18" "18\t#include <stdio.h>" "source reading on"
+
+# File opening is turned off therefore source lines are not printed.
+gdb_test_no_output "set source open off"
+gdb_test "show source open" "Source opening is \"off\"\\." \
+ "source opening is now off"
+gdb_test "list 18" "18\tin .*/${srcfile}" "source reading off"
+
+gdb_test "forward-search main" "source code access disabled"
+gdb_test "reverse-search main" "source code access disabled"
+
+# And finally, turn source code reading back on.
+gdb_test_no_output "set source open on" \
+ "turn source reading back on"
+gdb_test "show source open" "Source opening is \"on\"\\." \
+ "source opening is on again"
+gdb_test "list 18" "18\t#include <stdio.h>" "source reading on again"