mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-03 04:12:10 +08:00
gdb: Add new -n flag to some info commands
The 'info variables', its alias 'whereis', and 'info functions' all include non-debug symbols in the output by default. The list of non-debug symbols can sometimes be quite long, resulting in the debug symbol based results being scrolled off the screen. This commit adds a '-n' flag to all of the commands listed above that excludes the non-debug symbols from the results, leaving just the debug symbol based results. gdb/ChangeLog: * cli/cli-utils.c (info_print_options_defs): Delete. (make_info_print_options_def_group): Delete. (extract_info_print_options): Delete. (info_print_command_completer): Delete. (info_print_args_help): Add extra parameter, and optionally include text about -n flag. * cli/cli-utils.h (struct info_print_options): Delete. (extract_info_print_options): Delete declaration. (info_print_command_completer): Delete declaration. (info_print_args_help): Add extra parameter, extend header comment. * python/python.c (gdbpy_rbreak): Pass additional parameter to search_symbols. * stack.c (struct info_print_options): New type. (info_print_options_defs): New file scoped variable. (make_info_print_options_def_group): New static function. (info_print_command_completer): New static function. (info_locals_command): Update to use new local functions. (info_args_command): Likewise. (_initialize_stack): Add extra parameter to calls to info_print_args_help. * symtab.c (search_symbols): Add extra parameter, use this to possibly excluse non-debug symbols. (symtab_symbol_info): Add extra parameter, which is passed on to search_symbols. (struct info_print_options): New type. (info_print_options_defs): New file scoped variable. (make_info_print_options_def_group): New static function. (info_print_command_completer): New static function. (info_variables_command): Update to use local functions, and pass extra parameter through to symtab_symbol_info. (info_functions_command): Likewise. (info_types_command): Pass additional argument through to symtab_symbol_info. (rbreak_command): Pass extra argument to search_symbols. (_initialize_symtab): Add extra arguments for calls to info_print_args_help, and update help text for 'info variables', 'whereis', and 'info functions' commands. * symtab.h (search_symbols): Add extra argument to declaration. * NEWS: Mention new flags. gdb/doc/ChangeLog: * gdb.texinfo (Symbols): Add information about the -n flag to "info variables" and "info functions". gdb/testsuite/ChangeLog: * gdb.base/info-fun.exp: Extend to test the -n flag for 'info functions'. Reindent as needed. * gdb.base/info-var-f1.c: New file. * gdb.base/info-var-f2.c: New file. * gdb.base/info-var.exp: New file. * gdb.base/info-var.h: New file.
This commit is contained in:
parent
c4a23bf878
commit
4acfdd20c9
@ -1,3 +1,46 @@
|
|||||||
|
2019-08-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* cli/cli-utils.c (info_print_options_defs): Delete.
|
||||||
|
(make_info_print_options_def_group): Delete.
|
||||||
|
(extract_info_print_options): Delete.
|
||||||
|
(info_print_command_completer): Delete.
|
||||||
|
(info_print_args_help): Add extra parameter, and optionally
|
||||||
|
include text about -n flag.
|
||||||
|
* cli/cli-utils.h (struct info_print_options): Delete.
|
||||||
|
(extract_info_print_options): Delete declaration.
|
||||||
|
(info_print_command_completer): Delete declaration.
|
||||||
|
(info_print_args_help): Add extra parameter, extend header
|
||||||
|
comment.
|
||||||
|
* python/python.c (gdbpy_rbreak): Pass additional parameter to
|
||||||
|
search_symbols.
|
||||||
|
* stack.c (struct info_print_options): New type.
|
||||||
|
(info_print_options_defs): New file scoped variable.
|
||||||
|
(make_info_print_options_def_group): New static function.
|
||||||
|
(info_print_command_completer): New static function.
|
||||||
|
(info_locals_command): Update to use new local functions.
|
||||||
|
(info_args_command): Likewise.
|
||||||
|
(_initialize_stack): Add extra parameter to calls to
|
||||||
|
info_print_args_help.
|
||||||
|
* symtab.c (search_symbols): Add extra parameter, use this to
|
||||||
|
possibly excluse non-debug symbols.
|
||||||
|
(symtab_symbol_info): Add extra parameter, which is passed on to
|
||||||
|
search_symbols.
|
||||||
|
(struct info_print_options): New type.
|
||||||
|
(info_print_options_defs): New file scoped variable.
|
||||||
|
(make_info_print_options_def_group): New static function.
|
||||||
|
(info_print_command_completer): New static function.
|
||||||
|
(info_variables_command): Update to use local functions, and pass
|
||||||
|
extra parameter through to symtab_symbol_info.
|
||||||
|
(info_functions_command): Likewise.
|
||||||
|
(info_types_command): Pass additional argument through to
|
||||||
|
symtab_symbol_info.
|
||||||
|
(rbreak_command): Pass extra argument to search_symbols.
|
||||||
|
(_initialize_symtab): Add extra arguments for calls to
|
||||||
|
info_print_args_help, and update help text for 'info variables',
|
||||||
|
'whereis', and 'info functions' commands.
|
||||||
|
* symtab.h (search_symbols): Add extra argument to declaration.
|
||||||
|
* NEWS: Mention new flags.
|
||||||
|
|
||||||
2019-08-26 Christian Biesinger <cbiesinger@google.com>
|
2019-08-26 Christian Biesinger <cbiesinger@google.com>
|
||||||
|
|
||||||
* symtab.c (lookup_static_symbol): Call the new function (and move
|
* symtab.c (lookup_static_symbol): Call the new function (and move
|
||||||
|
5
gdb/NEWS
5
gdb/NEWS
@ -256,6 +256,11 @@ maint show test-options-completion-result
|
|||||||
printing of some header information in a similar fashion to "info
|
printing of some header information in a similar fashion to "info
|
||||||
variables" and "info functions".
|
variables" and "info functions".
|
||||||
|
|
||||||
|
** The "info variables", "info functions", and "whereis" commands
|
||||||
|
now take a '-n' flag that excludes non-debug symbols (symbols
|
||||||
|
from the symbol table, not from the debug info such as DWARF)
|
||||||
|
from the results.
|
||||||
|
|
||||||
* Completion improvements
|
* Completion improvements
|
||||||
|
|
||||||
** GDB can now complete the options of the "thread apply all" and
|
** GDB can now complete the options of the "thread apply all" and
|
||||||
|
@ -194,7 +194,8 @@ report_unrecognized_option_error (const char *command, const char *args)
|
|||||||
|
|
||||||
const char *
|
const char *
|
||||||
info_print_args_help (const char *prefix,
|
info_print_args_help (const char *prefix,
|
||||||
const char *entity_kind)
|
const char *entity_kind,
|
||||||
|
bool document_n_flag)
|
||||||
{
|
{
|
||||||
return xstrprintf (_("\
|
return xstrprintf (_("\
|
||||||
%sIf NAMEREGEXP is provided, only prints the %s whose name\n\
|
%sIf NAMEREGEXP is provided, only prints the %s whose name\n\
|
||||||
@ -204,8 +205,11 @@ matches TYPEREGEXP. Note that the matching is done with the type\n\
|
|||||||
printed by the 'whatis' command.\n\
|
printed by the 'whatis' command.\n\
|
||||||
By default, the command might produce headers and/or messages indicating\n\
|
By default, the command might produce headers and/or messages indicating\n\
|
||||||
why no %s can be printed.\n\
|
why no %s can be printed.\n\
|
||||||
The flag -q disables the production of these headers and messages."),
|
The flag -q disables the production of these headers and messages.%s"),
|
||||||
prefix, entity_kind, entity_kind, entity_kind);
|
prefix, entity_kind, entity_kind, entity_kind,
|
||||||
|
(document_n_flag ? _("\n\
|
||||||
|
By default, the command will include non-debug symbols in the output;\n\
|
||||||
|
these can be excluded using the -n flag.") : ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See documentation in cli-utils.h. */
|
/* See documentation in cli-utils.h. */
|
||||||
@ -435,58 +439,3 @@ validate_flags_qcs (const char *which_command, qcs_flags *flags)
|
|||||||
error (_("%s: -c and -s are mutually exclusive"), which_command);
|
error (_("%s: -c and -s are mutually exclusive"), which_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The options used by the 'info variables' commands and similar. */
|
|
||||||
|
|
||||||
static const gdb::option::option_def info_print_options_defs[] = {
|
|
||||||
gdb::option::boolean_option_def<info_print_options> {
|
|
||||||
"q",
|
|
||||||
[] (info_print_options *opt) { return &opt->quiet; },
|
|
||||||
nullptr, /* show_cmd_cb */
|
|
||||||
nullptr /* set_doc */
|
|
||||||
},
|
|
||||||
|
|
||||||
gdb::option::string_option_def<info_print_options> {
|
|
||||||
"t",
|
|
||||||
[] (info_print_options *opt) { return &opt->type_regexp; },
|
|
||||||
nullptr, /* show_cmd_cb */
|
|
||||||
nullptr /* set_doc */
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Returns the option group used by 'info variables' and similar. */
|
|
||||||
|
|
||||||
static gdb::option::option_def_group
|
|
||||||
make_info_print_options_def_group (info_print_options *opts)
|
|
||||||
{
|
|
||||||
return {{info_print_options_defs}, opts};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in cli-utils.h. */
|
|
||||||
|
|
||||||
void
|
|
||||||
extract_info_print_options (info_print_options *opts,
|
|
||||||
const char **args)
|
|
||||||
{
|
|
||||||
auto grp = make_info_print_options_def_group (opts);
|
|
||||||
gdb::option::process_options
|
|
||||||
(args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
|
||||||
if (*args != nullptr && **args == '\0')
|
|
||||||
*args = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* See documentation in cli-utils.h. */
|
|
||||||
|
|
||||||
void
|
|
||||||
info_print_command_completer (struct cmd_list_element *ignore,
|
|
||||||
completion_tracker &tracker,
|
|
||||||
const char *text, const char * /* word */)
|
|
||||||
{
|
|
||||||
const auto group
|
|
||||||
= make_info_print_options_def_group (nullptr);
|
|
||||||
if (gdb::option::complete_options
|
|
||||||
(tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
|
|
||||||
return;
|
|
||||||
|
|
||||||
const char *word = advance_to_expression_complete_word_point (tracker, text);
|
|
||||||
symbol_completer (ignore, tracker, text, word);
|
|
||||||
}
|
|
||||||
|
@ -47,38 +47,6 @@ extern int get_number (char **);
|
|||||||
error instead of returning 0. */
|
error instead of returning 0. */
|
||||||
extern ULONGEST get_ulongest (const char **pp, int trailer = '\0');
|
extern ULONGEST get_ulongest (const char **pp, int trailer = '\0');
|
||||||
|
|
||||||
/* Structure to hold the values of the options used by the 'info
|
|
||||||
variables' command and other similar commands. These correspond to the
|
|
||||||
-q and -t options. */
|
|
||||||
|
|
||||||
struct info_print_options
|
|
||||||
{
|
|
||||||
int quiet = false;
|
|
||||||
char *type_regexp = nullptr;
|
|
||||||
|
|
||||||
~info_print_options ()
|
|
||||||
{
|
|
||||||
xfree (type_regexp);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Extract options from ARGS for commands like 'info variables', placing
|
|
||||||
the options into OPTS. ARGS is updated to point to the first character
|
|
||||||
after the options, or, if there is nothing after the options, then ARGS
|
|
||||||
is set to nullptr. */
|
|
||||||
|
|
||||||
extern void extract_info_print_options (info_print_options *opts,
|
|
||||||
const char **args);
|
|
||||||
|
|
||||||
/* Function that can be used as a command completer for 'info variable'
|
|
||||||
and friends. This offers command option completion as well as symbol
|
|
||||||
completion. At the moment all symbols are offered for all commands. */
|
|
||||||
|
|
||||||
extern void info_print_command_completer (struct cmd_list_element *ignore,
|
|
||||||
completion_tracker &tracker,
|
|
||||||
const char *text,
|
|
||||||
const char * /* word */);
|
|
||||||
|
|
||||||
/* Throws an error telling the user that ARGS starts with an option
|
/* Throws an error telling the user that ARGS starts with an option
|
||||||
unrecognized by COMMAND. */
|
unrecognized by COMMAND. */
|
||||||
|
|
||||||
@ -87,10 +55,13 @@ extern void report_unrecognized_option_error (const char *command,
|
|||||||
|
|
||||||
|
|
||||||
/* Builds the help string for a command documented by PREFIX,
|
/* Builds the help string for a command documented by PREFIX,
|
||||||
followed by the extract_info_print_args help for ENTITY_KIND. */
|
followed by the extract_info_print_args help for ENTITY_KIND. If
|
||||||
|
DOCUMENT_N_FLAG is true then help text descibing the -n flag is also
|
||||||
|
included. */
|
||||||
|
|
||||||
const char *info_print_args_help (const char *prefix,
|
const char *info_print_args_help (const char *prefix,
|
||||||
const char *entity_kind);
|
const char *entity_kind,
|
||||||
|
bool document_n_flag);
|
||||||
|
|
||||||
/* Parse a number or a range.
|
/* Parse a number or a range.
|
||||||
A number will be of the form handled by get_number.
|
A number will be of the form handled by get_number.
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2019-08-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Symbols): Add information about the -n flag to
|
||||||
|
"info variables" and "info functions".
|
||||||
|
|
||||||
2019-08-25 Yoshinori Sato <ysato@users.sourceforge.jp>
|
2019-08-25 Yoshinori Sato <ysato@users.sourceforge.jp>
|
||||||
|
|
||||||
* gdb.texinfo (Standard Target Features): Add RX Features sub-section.
|
* gdb.texinfo (Standard Target Features): Add RX Features sub-section.
|
||||||
|
@ -18594,7 +18594,7 @@ The matching is case-sensitive, except on operating systems that
|
|||||||
have case-insensitive filesystem (e.g., MS-Windows).
|
have case-insensitive filesystem (e.g., MS-Windows).
|
||||||
|
|
||||||
@kindex info functions
|
@kindex info functions
|
||||||
@item info functions [-q]
|
@item info functions [-q] [-n]
|
||||||
Print the names and data types of all defined functions.
|
Print the names and data types of all defined functions.
|
||||||
Similarly to @samp{info types}, this command groups its output by source
|
Similarly to @samp{info types}, this command groups its output by source
|
||||||
files and annotates each function definition with its source line
|
files and annotates each function definition with its source line
|
||||||
@ -18607,11 +18607,16 @@ to print the function name and type according to the
|
|||||||
language of the function, other values mean to use
|
language of the function, other values mean to use
|
||||||
the manually specified language (see @ref{Manually, ,Set Language Manually}).
|
the manually specified language (see @ref{Manually, ,Set Language Manually}).
|
||||||
|
|
||||||
|
The @samp{-n} flag excludes @dfn{non-debugging symbols} from the
|
||||||
|
results. A non-debugging symbol is a symbol that comes from the
|
||||||
|
executable's symbol table, not from the debug information (for
|
||||||
|
example, DWARF) associated with the executable.
|
||||||
|
|
||||||
The optional flag @samp{-q}, which stands for @samp{quiet}, disables
|
The optional flag @samp{-q}, which stands for @samp{quiet}, disables
|
||||||
printing header information and messages explaining why no functions
|
printing header information and messages explaining why no functions
|
||||||
have been printed.
|
have been printed.
|
||||||
|
|
||||||
@item info functions [-q] [-t @var{type_regexp}] [@var{regexp}]
|
@item info functions [-q] [-n] [-t @var{type_regexp}] [@var{regexp}]
|
||||||
Like @samp{info functions}, but only print the names and data types
|
Like @samp{info functions}, but only print the names and data types
|
||||||
of the functions selected with the provided regexp(s).
|
of the functions selected with the provided regexp(s).
|
||||||
|
|
||||||
@ -18641,7 +18646,7 @@ is printed only if its name matches @var{regexp} and its type matches
|
|||||||
|
|
||||||
|
|
||||||
@kindex info variables
|
@kindex info variables
|
||||||
@item info variables [-q]
|
@item info variables [-q] [-n]
|
||||||
Print the names and data types of all variables that are defined
|
Print the names and data types of all variables that are defined
|
||||||
outside of functions (i.e.@: excluding local variables).
|
outside of functions (i.e.@: excluding local variables).
|
||||||
The printed variables are grouped by source files and annotated with
|
The printed variables are grouped by source files and annotated with
|
||||||
@ -18654,11 +18659,13 @@ to print the variable name and type according to the
|
|||||||
language of the variable, other values mean to use
|
language of the variable, other values mean to use
|
||||||
the manually specified language (see @ref{Manually, ,Set Language Manually}).
|
the manually specified language (see @ref{Manually, ,Set Language Manually}).
|
||||||
|
|
||||||
|
The @samp{-n} flag excludes non-debugging symbols from the results.
|
||||||
|
|
||||||
The optional flag @samp{-q}, which stands for @samp{quiet}, disables
|
The optional flag @samp{-q}, which stands for @samp{quiet}, disables
|
||||||
printing header information and messages explaining why no variables
|
printing header information and messages explaining why no variables
|
||||||
have been printed.
|
have been printed.
|
||||||
|
|
||||||
@item info variables [-q] [-t @var{type_regexp}] [@var{regexp}]
|
@item info variables [-q] [-n] [-t @var{type_regexp}] [@var{regexp}]
|
||||||
Like @kbd{info variables}, but only print the variables selected
|
Like @kbd{info variables}, but only print the variables selected
|
||||||
with the provided regexp(s).
|
with the provided regexp(s).
|
||||||
|
|
||||||
|
@ -739,10 +739,10 @@ gdbpy_rbreak (PyObject *self, PyObject *args, PyObject *kw)
|
|||||||
const char **files = symtab_paths.vec.data ();
|
const char **files = symtab_paths.vec.data ();
|
||||||
|
|
||||||
symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL,
|
symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL,
|
||||||
symtab_paths.vec.size (), files);
|
symtab_paths.vec.size (), files, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL, 0, NULL);
|
symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL, 0, NULL, false);
|
||||||
|
|
||||||
/* Count the number of symbols (both symbols and optionally minimal
|
/* Count the number of symbols (both symbols and optionally minimal
|
||||||
symbols) so we can correctly check the throttle limit. */
|
symbols) so we can correctly check the throttle limit. */
|
||||||
|
77
gdb/stack.c
77
gdb/stack.c
@ -2417,13 +2417,76 @@ print_frame_local_vars (struct frame_info *frame,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Structure to hold the values of the options used by the 'info
|
||||||
|
variables' command and other similar commands. These correspond to the
|
||||||
|
-q and -t options. */
|
||||||
|
|
||||||
|
struct info_print_options
|
||||||
|
{
|
||||||
|
int quiet = false;
|
||||||
|
char *type_regexp = nullptr;
|
||||||
|
|
||||||
|
~info_print_options ()
|
||||||
|
{
|
||||||
|
xfree (type_regexp);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The options used by the 'info locals' and 'info args' commands. */
|
||||||
|
|
||||||
|
static const gdb::option::option_def info_print_options_defs[] = {
|
||||||
|
gdb::option::boolean_option_def<info_print_options> {
|
||||||
|
"q",
|
||||||
|
[] (info_print_options *opt) { return &opt->quiet; },
|
||||||
|
nullptr, /* show_cmd_cb */
|
||||||
|
nullptr /* set_doc */
|
||||||
|
},
|
||||||
|
|
||||||
|
gdb::option::string_option_def<info_print_options> {
|
||||||
|
"t",
|
||||||
|
[] (info_print_options *opt) { return &opt->type_regexp; },
|
||||||
|
nullptr, /* show_cmd_cb */
|
||||||
|
nullptr /* set_doc */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Returns the option group used by 'info locals' and 'info args'
|
||||||
|
commands. */
|
||||||
|
|
||||||
|
static gdb::option::option_def_group
|
||||||
|
make_info_print_options_def_group (info_print_options *opts)
|
||||||
|
{
|
||||||
|
return {{info_print_options_defs}, opts};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Command completer for 'info locals' and 'info args'. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
info_print_command_completer (struct cmd_list_element *ignore,
|
||||||
|
completion_tracker &tracker,
|
||||||
|
const char *text, const char * /* word */)
|
||||||
|
{
|
||||||
|
const auto group
|
||||||
|
= make_info_print_options_def_group (nullptr);
|
||||||
|
if (gdb::option::complete_options
|
||||||
|
(tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const char *word = advance_to_expression_complete_word_point (tracker, text);
|
||||||
|
symbol_completer (ignore, tracker, text, word);
|
||||||
|
}
|
||||||
|
|
||||||
/* Implement the 'info locals' command. */
|
/* Implement the 'info locals' command. */
|
||||||
|
|
||||||
void
|
void
|
||||||
info_locals_command (const char *args, int from_tty)
|
info_locals_command (const char *args, int from_tty)
|
||||||
{
|
{
|
||||||
info_print_options opts;
|
info_print_options opts;
|
||||||
extract_info_print_options (&opts, &args);
|
auto grp = make_info_print_options_def_group (&opts);
|
||||||
|
gdb::option::process_options
|
||||||
|
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
||||||
|
if (args != nullptr && *args == '\0')
|
||||||
|
args = nullptr;
|
||||||
|
|
||||||
print_frame_local_vars (get_selected_frame (_("No frame selected.")),
|
print_frame_local_vars (get_selected_frame (_("No frame selected.")),
|
||||||
opts.quiet, args, opts.type_regexp,
|
opts.quiet, args, opts.type_regexp,
|
||||||
@ -2530,7 +2593,11 @@ void
|
|||||||
info_args_command (const char *args, int from_tty)
|
info_args_command (const char *args, int from_tty)
|
||||||
{
|
{
|
||||||
info_print_options opts;
|
info_print_options opts;
|
||||||
extract_info_print_options (&opts, &args);
|
auto grp = make_info_print_options_def_group (&opts);
|
||||||
|
gdb::option::process_options
|
||||||
|
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
||||||
|
if (args != nullptr && *args == '\0')
|
||||||
|
args = nullptr;
|
||||||
|
|
||||||
print_frame_arg_vars (get_selected_frame (_("No frame selected.")),
|
print_frame_arg_vars (get_selected_frame (_("No frame selected.")),
|
||||||
opts.quiet, args, opts.type_regexp, gdb_stdout);
|
opts.quiet, args, opts.type_regexp, gdb_stdout);
|
||||||
@ -3487,14 +3554,16 @@ Usage: info frame level LEVEL"),
|
|||||||
All local variables of current stack frame or those matching REGEXPs.\n\
|
All local variables of current stack frame or those matching REGEXPs.\n\
|
||||||
Usage: info locals [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
Usage: info locals [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
||||||
Prints the local variables of the current stack frame.\n"),
|
Prints the local variables of the current stack frame.\n"),
|
||||||
_("local variables")));
|
_("local variables"),
|
||||||
|
false));
|
||||||
set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
|
set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
|
||||||
cmd = add_info ("args", info_args_command,
|
cmd = add_info ("args", info_args_command,
|
||||||
info_print_args_help (_("\
|
info_print_args_help (_("\
|
||||||
All argument variables of current stack frame or those matching REGEXPs.\n\
|
All argument variables of current stack frame or those matching REGEXPs.\n\
|
||||||
Usage: info args [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
Usage: info args [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
||||||
Prints the argument variables of the current stack frame.\n"),
|
Prints the argument variables of the current stack frame.\n"),
|
||||||
_("argument variables")));
|
_("argument variables"),
|
||||||
|
false));
|
||||||
set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
|
set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
|
||||||
|
|
||||||
if (dbx_commands)
|
if (dbx_commands)
|
||||||
|
120
gdb/symtab.c
120
gdb/symtab.c
@ -4453,12 +4453,16 @@ sort_search_symbols_remove_dups (std::vector<symbol_search> *result)
|
|||||||
|
|
||||||
Within each file the results are sorted locally; each symtab's global and
|
Within each file the results are sorted locally; each symtab's global and
|
||||||
static blocks are separately alphabetized.
|
static blocks are separately alphabetized.
|
||||||
Duplicate entries are removed. */
|
Duplicate entries are removed.
|
||||||
|
|
||||||
|
When EXCLUDE_MINSYMS is false then matching minsyms are also returned,
|
||||||
|
otherwise they are excluded. */
|
||||||
|
|
||||||
std::vector<symbol_search>
|
std::vector<symbol_search>
|
||||||
search_symbols (const char *regexp, enum search_domain kind,
|
search_symbols (const char *regexp, enum search_domain kind,
|
||||||
const char *t_regexp,
|
const char *t_regexp,
|
||||||
int nfiles, const char *files[])
|
int nfiles, const char *files[],
|
||||||
|
bool exclude_minsyms)
|
||||||
{
|
{
|
||||||
const struct blockvector *bv;
|
const struct blockvector *bv;
|
||||||
const struct block *b;
|
const struct block *b;
|
||||||
@ -4674,6 +4678,7 @@ search_symbols (const char *regexp, enum search_domain kind,
|
|||||||
as we assume that a minimal symbol does not have a type. */
|
as we assume that a minimal symbol does not have a type. */
|
||||||
|
|
||||||
if ((found_misc || (nfiles == 0 && kind != FUNCTIONS_DOMAIN))
|
if ((found_misc || (nfiles == 0 && kind != FUNCTIONS_DOMAIN))
|
||||||
|
&& !exclude_minsyms
|
||||||
&& !treg.has_value ())
|
&& !treg.has_value ())
|
||||||
{
|
{
|
||||||
for (objfile *objfile : current_program_space->objfiles ())
|
for (objfile *objfile : current_program_space->objfiles ())
|
||||||
@ -4820,7 +4825,7 @@ print_msymbol_info (struct bound_minimal_symbol msymbol)
|
|||||||
matches. */
|
matches. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
symtab_symbol_info (bool quiet,
|
symtab_symbol_info (bool quiet, bool exclude_minsyms,
|
||||||
const char *regexp, enum search_domain kind,
|
const char *regexp, enum search_domain kind,
|
||||||
const char *t_regexp, int from_tty)
|
const char *t_regexp, int from_tty)
|
||||||
{
|
{
|
||||||
@ -4836,7 +4841,8 @@ symtab_symbol_info (bool quiet,
|
|||||||
|
|
||||||
/* Must make sure that if we're interrupted, symbols gets freed. */
|
/* Must make sure that if we're interrupted, symbols gets freed. */
|
||||||
std::vector<symbol_search> symbols = search_symbols (regexp, kind,
|
std::vector<symbol_search> symbols = search_symbols (regexp, kind,
|
||||||
t_regexp, 0, NULL);
|
t_regexp, 0, NULL,
|
||||||
|
exclude_minsyms);
|
||||||
|
|
||||||
if (!quiet)
|
if (!quiet)
|
||||||
{
|
{
|
||||||
@ -4889,15 +4895,87 @@ symtab_symbol_info (bool quiet,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Structure to hold the values of the options used by the 'info variables'
|
||||||
|
and 'info functions' commands. These correspond to the -q, -t, and -n
|
||||||
|
options. */
|
||||||
|
|
||||||
|
struct info_print_options
|
||||||
|
{
|
||||||
|
int quiet = false;
|
||||||
|
int exclude_minsyms = false;
|
||||||
|
char *type_regexp = nullptr;
|
||||||
|
|
||||||
|
~info_print_options ()
|
||||||
|
{
|
||||||
|
xfree (type_regexp);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The options used by the 'info variables' and 'info functions'
|
||||||
|
commands. */
|
||||||
|
|
||||||
|
static const gdb::option::option_def info_print_options_defs[] = {
|
||||||
|
gdb::option::boolean_option_def<info_print_options> {
|
||||||
|
"q",
|
||||||
|
[] (info_print_options *opt) { return &opt->quiet; },
|
||||||
|
nullptr, /* show_cmd_cb */
|
||||||
|
nullptr /* set_doc */
|
||||||
|
},
|
||||||
|
|
||||||
|
gdb::option::boolean_option_def<info_print_options> {
|
||||||
|
"n",
|
||||||
|
[] (info_print_options *opt) { return &opt->exclude_minsyms; },
|
||||||
|
nullptr, /* show_cmd_cb */
|
||||||
|
nullptr /* set_doc */
|
||||||
|
},
|
||||||
|
|
||||||
|
gdb::option::string_option_def<info_print_options> {
|
||||||
|
"t",
|
||||||
|
[] (info_print_options *opt) { return &opt->type_regexp; },
|
||||||
|
nullptr, /* show_cmd_cb */
|
||||||
|
nullptr /* set_doc */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Returns the option group used by 'info variables' and 'info
|
||||||
|
functions'. */
|
||||||
|
|
||||||
|
static gdb::option::option_def_group
|
||||||
|
make_info_print_options_def_group (info_print_options *opts)
|
||||||
|
{
|
||||||
|
return {{info_print_options_defs}, opts};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Command completer for 'info variables' and 'info functions'. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
info_print_command_completer (struct cmd_list_element *ignore,
|
||||||
|
completion_tracker &tracker,
|
||||||
|
const char *text, const char * /* word */)
|
||||||
|
{
|
||||||
|
const auto group
|
||||||
|
= make_info_print_options_def_group (nullptr);
|
||||||
|
if (gdb::option::complete_options
|
||||||
|
(tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, group))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const char *word = advance_to_expression_complete_word_point (tracker, text);
|
||||||
|
symbol_completer (ignore, tracker, text, word);
|
||||||
|
}
|
||||||
|
|
||||||
/* Implement the 'info variables' command. */
|
/* Implement the 'info variables' command. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
info_variables_command (const char *args, int from_tty)
|
info_variables_command (const char *args, int from_tty)
|
||||||
{
|
{
|
||||||
info_print_options opts;
|
info_print_options opts;
|
||||||
extract_info_print_options (&opts, &args);
|
auto grp = make_info_print_options_def_group (&opts);
|
||||||
|
gdb::option::process_options
|
||||||
|
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
||||||
|
if (args != nullptr && *args == '\0')
|
||||||
|
args = nullptr;
|
||||||
|
|
||||||
symtab_symbol_info (opts.quiet, args, VARIABLES_DOMAIN,
|
symtab_symbol_info (opts.quiet, opts.exclude_minsyms, args, VARIABLES_DOMAIN,
|
||||||
opts.type_regexp, from_tty);
|
opts.type_regexp, from_tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4907,10 +4985,14 @@ static void
|
|||||||
info_functions_command (const char *args, int from_tty)
|
info_functions_command (const char *args, int from_tty)
|
||||||
{
|
{
|
||||||
info_print_options opts;
|
info_print_options opts;
|
||||||
extract_info_print_options (&opts, &args);
|
auto grp = make_info_print_options_def_group (&opts);
|
||||||
|
gdb::option::process_options
|
||||||
|
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
||||||
|
if (args != nullptr && *args == '\0')
|
||||||
|
args = nullptr;
|
||||||
|
|
||||||
symtab_symbol_info (opts.quiet, args, FUNCTIONS_DOMAIN,
|
symtab_symbol_info (opts.quiet, opts.exclude_minsyms, args,
|
||||||
opts.type_regexp, from_tty);
|
FUNCTIONS_DOMAIN, opts.type_regexp, from_tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Holds the -q option for the 'info types' command. */
|
/* Holds the -q option for the 'info types' command. */
|
||||||
@ -4951,7 +5033,7 @@ info_types_command (const char *args, int from_tty)
|
|||||||
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
(&args, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_OPERAND, grp);
|
||||||
if (args != nullptr && *args == '\0')
|
if (args != nullptr && *args == '\0')
|
||||||
args = nullptr;
|
args = nullptr;
|
||||||
symtab_symbol_info (opts.quiet, args, TYPES_DOMAIN, NULL, from_tty);
|
symtab_symbol_info (opts.quiet, false, args, TYPES_DOMAIN, NULL, from_tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Command completer for 'info types' command. */
|
/* Command completer for 'info types' command. */
|
||||||
@ -5012,7 +5094,8 @@ rbreak_command (const char *regexp, int from_tty)
|
|||||||
std::vector<symbol_search> symbols = search_symbols (regexp,
|
std::vector<symbol_search> symbols = search_symbols (regexp,
|
||||||
FUNCTIONS_DOMAIN,
|
FUNCTIONS_DOMAIN,
|
||||||
NULL,
|
NULL,
|
||||||
nfiles, files);
|
nfiles, files,
|
||||||
|
false);
|
||||||
|
|
||||||
scoped_rbreak_breakpoints finalize;
|
scoped_rbreak_breakpoints finalize;
|
||||||
for (const symbol_search &p : symbols)
|
for (const symbol_search &p : symbols)
|
||||||
@ -6201,27 +6284,30 @@ _initialize_symtab (void)
|
|||||||
c = add_info ("variables", info_variables_command,
|
c = add_info ("variables", info_variables_command,
|
||||||
info_print_args_help (_("\
|
info_print_args_help (_("\
|
||||||
All global and static variable names or those matching REGEXPs.\n\
|
All global and static variable names or those matching REGEXPs.\n\
|
||||||
Usage: info variables [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
Usage: info variables [-q] [-n] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
||||||
Prints the global and static variables.\n"),
|
Prints the global and static variables.\n"),
|
||||||
_("global and static variables")));
|
_("global and static variables"),
|
||||||
|
true));
|
||||||
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
||||||
if (dbx_commands)
|
if (dbx_commands)
|
||||||
{
|
{
|
||||||
c = add_com ("whereis", class_info, info_variables_command,
|
c = add_com ("whereis", class_info, info_variables_command,
|
||||||
info_print_args_help (_("\
|
info_print_args_help (_("\
|
||||||
All global and static variable names, or those matching REGEXPs.\n\
|
All global and static variable names, or those matching REGEXPs.\n\
|
||||||
Usage: whereis [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
Usage: whereis [-q] [-n] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
||||||
Prints the global and static variables.\n"),
|
Prints the global and static variables.\n"),
|
||||||
_("global and static variables")));
|
_("global and static variables"),
|
||||||
|
true));
|
||||||
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
||||||
}
|
}
|
||||||
|
|
||||||
c = add_info ("functions", info_functions_command,
|
c = add_info ("functions", info_functions_command,
|
||||||
info_print_args_help (_("\
|
info_print_args_help (_("\
|
||||||
All function names or those matching REGEXPs.\n\
|
All function names or those matching REGEXPs.\n\
|
||||||
Usage: info functions [-q] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
Usage: info functions [-q] [-n] [-t TYPEREGEXP] [NAMEREGEXP]\n\
|
||||||
Prints the functions.\n"),
|
Prints the functions.\n"),
|
||||||
_("functions")));
|
_("functions"),
|
||||||
|
true));
|
||||||
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
set_cmd_completer_handle_brkchars (c, info_print_command_completer);
|
||||||
|
|
||||||
c = add_info ("types", info_types_command, _("\
|
c = add_info ("types", info_types_command, _("\
|
||||||
|
@ -2027,7 +2027,8 @@ extern std::vector<symbol_search> search_symbols (const char *,
|
|||||||
enum search_domain,
|
enum search_domain,
|
||||||
const char *,
|
const char *,
|
||||||
int,
|
int,
|
||||||
const char **);
|
const char **,
|
||||||
|
bool);
|
||||||
extern bool treg_matches_sym_type_name (const compiled_regex &treg,
|
extern bool treg_matches_sym_type_name (const compiled_regex &treg,
|
||||||
const struct symbol *sym);
|
const struct symbol *sym);
|
||||||
|
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
2019-08-27 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
|
* gdb.base/info-fun.exp: Extend to test the -n flag for 'info
|
||||||
|
functions'. Reindent as needed.
|
||||||
|
* gdb.base/info-var-f1.c: New file.
|
||||||
|
* gdb.base/info-var-f2.c: New file.
|
||||||
|
* gdb.base/info-var.exp: New file.
|
||||||
|
* gdb.base/info-var.h: New file.
|
||||||
|
|
||||||
2019-08-26 Tom de Vries <tdevries@suse.de>
|
2019-08-26 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
PR c++/24852
|
PR c++/24852
|
||||||
|
@ -30,54 +30,63 @@ if [get_compiler_info] {
|
|||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
# SEP must be last for the possible `unsupported' error path.
|
foreach_with_prefix n_flag { 0 1 } {
|
||||||
foreach libsepdebug {NO IN SEP} { with_test_prefix "$libsepdebug" {
|
|
||||||
|
|
||||||
set sep_lib_flags $lib_flags
|
# SEP must be last for the possible `unsupported' error path.
|
||||||
if {$libsepdebug != "NO"} {
|
foreach libsepdebug {NO IN SEP} { with_test_prefix "$libsepdebug" {
|
||||||
lappend sep_lib_flags {debug}
|
|
||||||
}
|
|
||||||
if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $sep_lib_flags] != ""
|
|
||||||
|| [gdb_compile $srcdir/$subdir/${srcfile} ${binfile} \
|
|
||||||
executable $bin_flags] != "" } {
|
|
||||||
untested "failed to compile"
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
if {$libsepdebug == "SEP"} {
|
set sep_lib_flags $lib_flags
|
||||||
if {[gdb_gnu_strip_debug $binfile_lib] != 0} {
|
if {$libsepdebug != "NO"} {
|
||||||
unsupported "could not split debug of $binfile_lib."
|
lappend sep_lib_flags {debug}
|
||||||
return
|
}
|
||||||
} else {
|
if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $sep_lib_flags] != ""
|
||||||
pass "split solib"
|
|| [gdb_compile $srcdir/$subdir/${srcfile} ${binfile} \
|
||||||
|
executable $bin_flags] != "" } {
|
||||||
|
untested "failed to compile"
|
||||||
|
return -1
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
clean_restart $executable
|
if {$libsepdebug == "SEP"} {
|
||||||
|
if {[gdb_gnu_strip_debug $binfile_lib] != 0} {
|
||||||
|
unsupported "could not split debug of $binfile_lib."
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
pass "split solib"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ![runto_main] then {
|
clean_restart $executable
|
||||||
fail "can't run to main"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
set match_str {All functions matching regular expression "foo":[\r\n]*}
|
if ![runto_main] then {
|
||||||
if { "$libsepdebug" != "NO" } {
|
fail "can't run to main"
|
||||||
append match_str {File .*/info-fun-solib[.]c:[\r\n]*}
|
return 0
|
||||||
append match_str {\d+:\tint foo\(void\);[\r\n]*}
|
}
|
||||||
}
|
|
||||||
append match_str {Non-debugging symbols:[\r\n]*}
|
|
||||||
# Note: Targets like {m68k,ppc64,s390x}-linux also have, e.g.,
|
|
||||||
# 00000011.plt_call.foo+0 (m68k).
|
|
||||||
set plt_foo_match "($hex \[^\r\n\]*plt\[^\r\n\]*foo\[^\r\n\]*\[\r\n\]*)?"
|
|
||||||
append match_str $plt_foo_match
|
|
||||||
# This text we want to match precisely.
|
|
||||||
append match_str "$hex *foo(@plt)?\[\r\n\]*"
|
|
||||||
# Watch for again to not have to worry about the order of appearance.
|
|
||||||
append match_str $plt_foo_match
|
|
||||||
if { "$libsepdebug" == "NO" } {
|
|
||||||
# Note: The ".?" is for targets like m68k-linux that have ".foo" here.
|
|
||||||
append match_str "$hex *.?foo\[\r\n\]*"
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_test "info fun foo" "$match_str"
|
set match_str {All functions matching regular expression "foo":[\r\n]*}
|
||||||
}}
|
if { "$libsepdebug" != "NO" } {
|
||||||
|
append match_str {File .*/info-fun-solib[.]c:[\r\n]*}
|
||||||
|
append match_str {\d+:\tint foo\(void\);[\r\n]*}
|
||||||
|
}
|
||||||
|
|
||||||
|
set opt ""
|
||||||
|
if { !$n_flag } {
|
||||||
|
append match_str {Non-debugging symbols:[\r\n]*}
|
||||||
|
# Note: Targets like {m68k,ppc64,s390x}-linux also have, e.g.,
|
||||||
|
# 00000011.plt_call.foo+0 (m68k).
|
||||||
|
set plt_foo_match "($hex \[^\r\n\]*plt\[^\r\n\]*foo\[^\r\n\]*\[\r\n\]*)?"
|
||||||
|
append match_str $plt_foo_match
|
||||||
|
# This text we want to match precisely.
|
||||||
|
append match_str "$hex *foo(@plt)?\[\r\n\]*"
|
||||||
|
# Watch for again to not have to worry about the order of appearance.
|
||||||
|
append match_str $plt_foo_match
|
||||||
|
if { "$libsepdebug" == "NO" } {
|
||||||
|
# Note: The ".?" is for targets like m68k-linux that have ".foo" here.
|
||||||
|
append match_str "$hex *.?foo\[\r\n\]*"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
set opt "-n"
|
||||||
|
}
|
||||||
|
|
||||||
|
gdb_test "info fun $opt foo" "$match_str"
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
24
gdb/testsuite/gdb.base/info-var-f1.c
Normal file
24
gdb/testsuite/gdb.base/info-var-f1.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* 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/>. */
|
||||||
|
|
||||||
|
#include "info-var.h"
|
||||||
|
|
||||||
|
static int f1_var = -3;
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return global_var + get_offset() + f1_var;
|
||||||
|
}
|
26
gdb/testsuite/gdb.base/info-var-f2.c
Normal file
26
gdb/testsuite/gdb.base/info-var-f2.c
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* 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/>. */
|
||||||
|
|
||||||
|
#include "info-var.h"
|
||||||
|
|
||||||
|
int global_var = 1;
|
||||||
|
|
||||||
|
static int f2_var = 2;
|
||||||
|
|
||||||
|
int
|
||||||
|
get_offset (void)
|
||||||
|
{
|
||||||
|
return f2_var;
|
||||||
|
}
|
60
gdb/testsuite/gdb.base/info-var.exp
Normal file
60
gdb/testsuite/gdb.base/info-var.exp
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Some basic testing of 'info variables'.
|
||||||
|
|
||||||
|
standard_testfile info-var-f1.c info-var-f2.c
|
||||||
|
|
||||||
|
if {[prepare_for_testing "failed to prepare" \
|
||||||
|
"${testfile}" "$srcfile $srcfile2" "debug"]} {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ![runto_main] then {
|
||||||
|
fail "can't run to main"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
gdb_test "info variables" \
|
||||||
|
[multi_line \
|
||||||
|
"All defined variables:" \
|
||||||
|
"" \
|
||||||
|
"File .*${srcfile}:" \
|
||||||
|
"18:\[ \t\]+static int f1_var;" \
|
||||||
|
"" \
|
||||||
|
"File .*${srcfile2}:" \
|
||||||
|
"18:\[ \t\]+int global_var;" \
|
||||||
|
"20:\[ \t\]+static int f2_var;" \
|
||||||
|
"" \
|
||||||
|
"Non-debugging symbols:" \
|
||||||
|
".*"]
|
||||||
|
|
||||||
|
gdb_test "info variables -n" \
|
||||||
|
[multi_line \
|
||||||
|
"All defined variables:" \
|
||||||
|
"" \
|
||||||
|
"File .*${srcfile}:" \
|
||||||
|
"18:\[ \t\]+static int f1_var;" \
|
||||||
|
"" \
|
||||||
|
"File .*${srcfile2}:" \
|
||||||
|
"18:\[ \t\]+int global_var;" \
|
||||||
|
"20:\[ \t\]+static int f2_var;" ]
|
||||||
|
|
||||||
|
gdb_test "info variables -n global" \
|
||||||
|
[multi_line \
|
||||||
|
"All variables matching regular expression \"global\":" \
|
||||||
|
"" \
|
||||||
|
"File .*${srcfile2}:" \
|
||||||
|
"18:\[ \t\]+int global_var;" ]
|
18
gdb/testsuite/gdb.base/info-var.h
Normal file
18
gdb/testsuite/gdb.base/info-var.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/* 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/>. */
|
||||||
|
|
||||||
|
extern int global_var;
|
||||||
|
|
||||||
|
extern int get_offset (void);
|
Loading…
Reference in New Issue
Block a user