New option "set print symbol-loading".

* NEWS: Mention it.
	* solib.c (solib_read_symbols): Only print symbol loading messages
	if requested.
	(solib_add): If symbol loading is in "brief" mode, notify user
	symbols are being loaded.
	(reload_shared_libraries_1): Ditto.
	* symfile.c (print_symbol_loading_off): New static global.
	(print_symbol_loading_brief): New static global.
	(print_symbol_loading_full): New static global.
	(print_symbol_loading_enums): New static global.
	(print_symbol_loading): New static global.
	(print_symbol_loading_p): New function.
	(symbol_file_add_with_addrs): Only print symbol loading messages
	if requested.
	(_initialize_symfile): Register "print symbol-loading" set/show
	command.
	* symfile.h (print_symbol_loading_p): Declare.

	doc/
	* gdb.texinfo (Symbols): Document set/show print symbol-loading.

	testsuite/
	* gdb.base/print-symbol-loading-lib.c: New file.
	* gdb.base/print-symbol-loading-main.c: New file.
	* gdb.base/print-symbol-loading.exp: New file.
This commit is contained in:
Doug Evans 2014-03-31 12:07:48 -07:00
parent 76f0cad6f4
commit 770e7fc78c
11 changed files with 321 additions and 2 deletions

View File

@ -1,3 +1,24 @@
2014-03-31 Doug Evans <dje@google.com>
New option "set print symbol-loading".
* NEWS: Mention it.
* solib.c (solib_read_symbols): Only print symbol loading messages
if requested.
(solib_add): If symbol loading is in "brief" mode, notify user
symbols are being loaded.
(reload_shared_libraries_1): Ditto.
* symfile.c (print_symbol_loading_off): New static global.
(print_symbol_loading_brief): New static global.
(print_symbol_loading_full): New static global.
(print_symbol_loading_enums): New static global.
(print_symbol_loading): New static global.
(print_symbol_loading_p): New function.
(symbol_file_add_with_addrs): Only print symbol loading messages
if requested.
(_initialize_symfile): Register "print symbol-loading" set/show
command.
* symfile.h (print_symbol_loading_p): Declare.
2014-03-30 Doug Evans <xdje42@gmail.com>
* infrun.c (set_last_target_status): New function.

View File

@ -28,6 +28,13 @@ info auto-load guile-scripts [regexp]
* New options
set print symbol-loading (off|brief|full)
show print symbol-loading
Control whether to print informational messages when loading symbol
information for a file. The default is "full", but when debugging
programs with large numbers of shared libraries the amount of output
becomes less useful.
set guile print-stack (none|message|full)
show guile print-stack
Show a stack trace when an error is encountered in a Guile script.

View File

@ -1,3 +1,7 @@
2014-03-31 Doug Evans <dje@google.com>
* gdb.texinfo (Symbols): Document set/show print symbol-loading.
2014-03-30 Doug Evans <dje@google.com>
* gdb.texinfo (Non-Stop Mode): Remove trailing whitespace.

View File

@ -16184,6 +16184,28 @@ is printed as follows:
@item show opaque-type-resolution
Show whether opaque types are resolved or not.
@kindex set print symbol-loading
@cindex print messages when symbols are loaded
@item set print symbol-loading
@itemx set print symbol-loading full
@itemx set print symbol-loading brief
@itemx set print symbol-loading off
The @code{set print symbol-loading} command allows you to control the
printing of messages when @value{GDBN} loads symbol information.
By default a message is printed for the executable and one for each
shared library, and normally this is what you want. However, when
debugging apps with large numbers of shared libraries these messages
can be annoying.
When set to @code{brief} a message is printed for each executable,
and when @value{GDBN} loads a collection of shared libraries at once
it will only print one message regardless of the number of shared
libraries. When set to @code{off} no messages are printed.
@kindex show print symbol-loading
@item show print symbol-loading
Show whether messages will be printed when a @value{GDBN} command
entered from the keyboard causes symbol information to be loaded.
@kindex maint print symbols
@cindex symbol dump
@kindex maint print psymbols

View File

@ -650,7 +650,7 @@ solib_read_symbols (struct so_list *so, int flags)
so->so_name);
else
{
if (from_tty || info_verbose)
if (print_symbol_loading_p (from_tty, 0, 1))
printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
so->symbols_loaded = 1;
}
@ -905,6 +905,17 @@ solib_add (char *pattern, int from_tty,
{
struct so_list *gdb;
if (print_symbol_loading_p (from_tty, 0, 0))
{
if (pattern != NULL)
{
printf_unfiltered (_("Loading symbols for shared libraries: %s\n"),
pattern);
}
else
printf_unfiltered (_("Loading symbols for shared libraries.\n"));
}
current_program_space->solib_add_generation++;
if (pattern)
@ -1277,6 +1288,9 @@ reload_shared_libraries_1 (int from_tty)
struct so_list *so;
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
if (print_symbol_loading_p (from_tty, 0, 0))
printf_unfiltered (_("Loading symbols for shared libraries.\n"));
for (so = so_list_head; so != NULL; so = so->next)
{
char *filename, *found_pathname = NULL;

View File

@ -143,6 +143,20 @@ DEF_VEC_O (registered_sym_fns);
static VEC (registered_sym_fns) *symtab_fns = NULL;
/* Values for "set print symbol-loading". */
const char print_symbol_loading_off[] = "off";
const char print_symbol_loading_brief[] = "brief";
const char print_symbol_loading_full[] = "full";
static const char *print_symbol_loading_enums[] =
{
print_symbol_loading_off,
print_symbol_loading_brief,
print_symbol_loading_full,
NULL
};
static const char *print_symbol_loading = print_symbol_loading_full;
/* If non-zero, shared library symbols will be added automatically
when the inferior is created, new libraries are loaded, or when
attaching to the inferior. This is almost always what users will
@ -156,6 +170,31 @@ static VEC (registered_sym_fns) *symtab_fns = NULL;
int auto_solib_add = 1;
/* Return non-zero if symbol-loading messages should be printed.
FROM_TTY is the standard from_tty argument to gdb commands.
If EXEC is non-zero the messages are for the executable.
Otherwise, messages are for shared libraries.
If FULL is non-zero then the caller is printing a detailed message.
E.g., the message includes the shared library name.
Otherwise, the caller is printing a brief "summary" message. */
int
print_symbol_loading_p (int from_tty, int exec, int full)
{
if (!from_tty && !info_verbose)
return 0;
if (exec)
{
/* We don't check FULL for executables, there are few such
messages, therefore brief == full. */
return print_symbol_loading != print_symbol_loading_off;
}
if (full)
return print_symbol_loading == print_symbol_loading_full;
return print_symbol_loading == print_symbol_loading_brief;
}
/* True if we are reading a symbol table. */
int currently_reading_symtab = 0;
@ -1112,7 +1151,7 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags,
struct objfile *objfile;
const int from_tty = add_flags & SYMFILE_VERBOSE;
const int mainline = add_flags & SYMFILE_MAINLINE;
const int should_print = ((from_tty || info_verbose)
const int should_print = (print_symbol_loading_p (from_tty, mainline, 1)
&& (readnow_symbol_files
|| (add_flags & SYMFILE_NO_READ) == 0));
@ -3985,4 +4024,18 @@ each global debug-file-directory component prepended."),
NULL,
show_debug_file_directory,
&setlist, &showlist);
add_setshow_enum_cmd ("symbol-loading", no_class,
print_symbol_loading_enums, &print_symbol_loading,
_("\
Set printing of symbol loading messages."), _("\
Show printing of symbol loading messages."), _("\
off == turn all messages off\n\
brief == print messages for the executable,\n\
and brief messages for shared libraries\n\
full == print messages for the executable,\n\
and messages for each shared library."),
NULL,
NULL,
&setprintlist, &showprintlist);
}

View File

@ -503,6 +503,8 @@ extern bfd *gdb_bfd_open_maybe_remote (const char *);
extern int get_section_index (struct objfile *, char *);
extern int print_symbol_loading_p (int from_tty, int mainline, int full);
/* Utility functions for overlay sections: */
extern enum overlay_debugging_state
{

View File

@ -1,3 +1,9 @@
2014-03-31 Doug Evans <dje@google.com>
* gdb.base/print-symbol-loading-lib.c: New file.
* gdb.base/print-symbol-loading-main.c: New file.
* gdb.base/print-symbol-loading.exp: New file.
2014-03-31 Yao Qi <yao@codesourcery.com>
* gdb.base/source-dir.exp: Allow ';' as a directory separator.

View File

@ -0,0 +1,21 @@
/* Copyright 2010-2014 Free Software Foundation, Inc.
This file is part of GDB.
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/>. */
void
lib (void)
{
}

View File

@ -0,0 +1,25 @@
/* Copyright 2010-2014 Free Software Foundation, Inc.
This file is part of GDB.
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 void lib (void);
int
main (void)
{
lib ();
return 0;
}

View File

@ -0,0 +1,144 @@
# Copyright 2012-2014 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 "print symbol-loading" option.
if {[skip_shlib_tests]} {
return 0
}
standard_testfile print-symbol-loading-main.c
set libfile print-symbol-loading-lib
set srcfile_lib ${libfile}.c
set binfile_lib [standard_output_file ${libfile}.so]
set gcorefile ${binfile}.gcore
set objfile [standard_output_file ${testfile}.o]
if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} {debug}] != ""
|| [gdb_compile ${srcdir}/${subdir}/${srcfile} ${objfile} object {debug}] != "" } {
untested ${testfile}.exp
return -1
}
set opts [list debug shlib=${binfile_lib}]
if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } {
untested ${testfile}.exp
return -1
}
clean_restart ${binfile}
gdb_load_shlibs ${binfile_lib}
# Does this gdb support gcore?
set test "help gcore"
gdb_test_multiple $test $test {
-re "Undefined command: .gcore.*\r\n$gdb_prompt $" {
# gcore command not supported -- nothing to test here.
unsupported "gdb does not support gcore on this target"
return -1
}
-re "Save a core file .*\r\n$gdb_prompt $" {
pass $test
}
}
if ![runto lib] {
return -1
}
if {![gdb_gcore_cmd $gcorefile "save a corefile"]} {
return -1
}
proc test_load_core { print_symbol_loading } {
global binfile binfile_lib gcorefile srcdir subdir
with_test_prefix "core ${print_symbol_loading}" {
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_test_no_output "set print symbol-loading $print_symbol_loading"
if { ${print_symbol_loading} != "off" } {
gdb_test "file $binfile" "Reading symbols from.*done\\." "file"
} else {
gdb_test_no_output "file $binfile" "file"
}
# Rename the shared lib so gdb can't find it.
remote_exec host "mv -f ${binfile_lib} ${binfile_lib}.save"
gdb_test "core ${gcorefile}" "Core was generated by .*" \
"re-load generated corefile"
# Now put it back and use "set solib-search-path" to trigger
# loading of symbols.
remote_exec host "mv -f ${binfile_lib}.save ${binfile_lib}"
set test_name "load shared-lib"
switch "${print_symbol_loading}" {
"off" {
gdb_test_no_output "set solib-search-path [file dirname ${binfile_lib}]" \
${test_name}
}
"brief" {
gdb_test "set solib-search-path [file dirname ${binfile_lib}]" \
"Loading symbols for shared libraries\\." \
${test_name}
}
"full" {
gdb_test "set solib-search-path [file dirname ${binfile_lib}]" \
"Reading symbols from.*Loaded symbols for.*" \
${test_name}
}
}
gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded"
}
}
test_load_core off
test_load_core brief
test_load_core full
# Now test the sharedlibrary command.
proc test_load_shlib { print_symbol_loading } {
global binfile
with_test_prefix "shlib ${print_symbol_loading}" {
clean_restart ${binfile}
gdb_test_no_output "set auto-solib-add off"
if ![runto_main] {
return -1
}
gdb_test_no_output "set print symbol-loading $print_symbol_loading"
set test_name "load shared-lib"
switch ${print_symbol_loading} {
"off" {
gdb_test_no_output "sharedlibrary .*" \
${test_name}
}
"brief" {
gdb_test "sharedlibrary .*" \
"Loading symbols for shared libraries: \\.\\*" \
${test_name}
}
"full" {
gdb_test "sharedlibrary .*" \
"Reading symbols from.*Loaded symbols for.*" \
${test_name}
}
}
gdb_breakpoint "lib"
gdb_continue_to_breakpoint "lib"
gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded"
}
}
test_load_shlib off
test_load_shlib brief
test_load_shlib full