mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-24 14:53:34 +08:00
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.
This commit is contained in:
parent
5cf3b30948
commit
fde1a9a3ee
9
gdb/NEWS
9
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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
66
gdb/source.c
66
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);
|
||||
}
|
||||
|
25
gdb/testsuite/gdb.base/source-open.c
Normal file
25
gdb/testsuite/gdb.base/source-open.c
Normal file
@ -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;
|
||||
}
|
44
gdb/testsuite/gdb.base/source-open.exp
Normal file
44
gdb/testsuite/gdb.base/source-open.exp
Normal file
@ -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"
|
Loading…
x
Reference in New Issue
Block a user