[RFA] Fix too many "no debugging symbols found" warnings.
Doug Evans
dje@google.com
Sat Jul 11 04:22:00 GMT 2009
On Thu, Jul 2, 2009 at 3:44 PM, Pedro Alves<pedro@codesourcery.com> wrote:
>> > OTOH, if GDB is printing nothing, then printing a sole:
>> >
>> > "(no debugging symbols found)"
>> >
>> > out of the blue, doesn't ever seem useful to me. Is that ever really useful?
>>
>> Well, s@no debugging symbols found@no debugging symbols found in
>> /usr/lib/libfoo.so@.
>
> What's the output in the non-auto-loaded case, then?
>
> "Reading symbols from /lib/librt.so.1... (no debugging symbols found in /lib/librt.so.1) ...done."
>
> ?
Reading symbols from /lib/librt.so.1... (no debugging symbols found) ...done.
The patch knows it has already printed the path in that case.
>> Users would like to know that something isn't going to work because
>> debug info is missing.
>> That is useful.
>
> It is useful to know when a module doesn't have debug info, sure, but,
> that transient warning has been printed like that for years, as is,
> without showing the shared library name. In that state, I'm not sure
> how useful it has been. It appears to me we have some freedom to play
> with it, and when it is printed.
True.
>> We could tell them differently of course. Maybe an option to "info
>> shared" to only show the ones without debug info or some such.
>
> We do have a "Syms Read" column in info shared's output, maybe we
> should extend that from "Yes, No" -> "Yes, Sorry-I've-tried-but-didn't-find-any, No".
> Then the user could ask GDB if it has debug info any time, instead of having
> to look up the log.
"works for me"
>> > Wouldn't tweaking the "no debugging symbols found" predicate make everyone happy?
>>
>> "Tweaking" as in only printing "no debugging symbols found [in
>> /usr/lib/libfoo.so]" if (from_tty || info_verbose), and never printing
>> it for auto-loaded libraries?
>
> s/auto-loaded libraries/auto-loaded libraries, modules, executables, whatnot/,
> yes.
I'm not sure if I'd be happy nor not, but see attached patch.
> I'll back away from arguing now, and let you decide to do what you think
> is best. I don't think I'll be miserable with the change. (though with a feeling
> of wrongly named option in my stomach.)
The attached patch adds an optional regex argument to "info shared"
and marks in the output libraries without debugging info.
With this addition, I don't see a real need for a "set print
symbol-loading-warning/whatever" option, thus I deleted it.
Ok to check in?
-------------- next part --------------
2009-07-10 Doug Evans <dje@google.com>
* NEWS: Remove note on `set print symbol-loading'.
Add note about new regex arg to "info sharedlibrary".
* main.c (captured_main): Pass !batch for from_tty when calling
symbol_file_add_main.
* objfiles.h (objfile_has_partial_symbols): Declare.
(objfile_has_full_symbols): Declare.
* objfiles.c (objfile_has_partial_symbols): New function.
(have_partial_symbols): Use it.
(objfile_has_full_symbols): New function.
(have_full_symbols): Use it.
* solib.c (solib_read_symbols): Back out patch of 2008-07-10.
Add test for info_verbose for symbol loading messages for
consistency with symfile.c.
(info_sharedlibrary_command): Handle optional parameter of regex of
libraries to list. Inform user of libraries without debugging info.
* symfile.c (print_symbol_loading): Delete.
(symbol_file_add_with_addrs_or_offsets): Back out patch of 2008-07-10.
Print "no debugging symbols found" only if from_tty || info_verbose;
and only check file being loaded, not all files.
(reread_symbols): Test file being loaded for whether it has symbols,
not all files.
(__initialize_symfile): Delete `set print symbol-loading'.
* symfile.h (print_symbol_loading): Delete.
* doc/gdb.texinfo: Delete `set print symbol-loading'.
Add note on new optional regex arg to `info sharedlibrary'.
Index: NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.316
diff -u -p -r1.316 NEWS
--- NEWS 2 Jul 2009 21:57:27 -0000 1.316
+++ NEWS 10 Jul 2009 21:50:19 -0000
@@ -33,6 +33,9 @@ remote targets. To use this feature, sp
with the `remote:' prefix, either via the `set sysroot' command or via
the `--with-sysroot' configure-time option.
+* "info sharedlibrary" now takes an optional regex of libraries to show,
+and it now reports if a shared library has no debugging information.
+
* Commands `set debug-file-directory', `set solib-search-path' and `set args'
now complete on file names.
@@ -225,10 +228,6 @@ set sh calling-convention
show sh calling-convention
Control the calling convention used when calling SH target functions.
-set print symbol-loading
-show print symbol-loading
- Control printing of symbol loading messages.
-
set debug timestamp
show debug timestamp
Control display of timestamps with GDB debugging output.
Index: main.c
===================================================================
RCS file: /cvs/src/src/gdb/main.c,v
retrieving revision 1.76
diff -u -p -r1.76 main.c
--- main.c 27 Apr 2009 10:24:08 -0000 1.76
+++ main.c 10 Jul 2009 21:50:19 -0000
@@ -801,14 +801,14 @@ Excess command line arguments ignored. (
open it, better only print one error message.
catch_command_errors returns non-zero on success! */
if (catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL))
- catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
+ catch_command_errors (symbol_file_add_main, symarg, !batch, RETURN_MASK_ALL);
}
else
{
if (execarg != NULL)
catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL);
if (symarg != NULL)
- catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
+ catch_command_errors (symbol_file_add_main, symarg, !batch, RETURN_MASK_ALL);
}
if (corearg && pidarg)
Index: objfiles.c
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.c,v
retrieving revision 1.84
diff -u -p -r1.84 objfiles.c
--- objfiles.c 23 Jun 2009 16:28:45 -0000 1.84
+++ objfiles.c 10 Jul 2009 21:50:19 -0000
@@ -677,6 +677,22 @@ objfile_relocate (struct objfile *objfil
breakpoint_re_set ();
}
+/* Return non-zero if OBJFILE has partial symbols. */
+
+int
+objfile_has_partial_symbols (struct objfile *objfile)
+{
+ return objfile->psymtabs != NULL;
+}
+
+/* Return non-zero if OBJFILE has full symbols. */
+
+int
+objfile_has_full_symbols (struct objfile *objfile)
+{
+ return objfile->symtabs != NULL;
+}
+
/* Many places in gdb want to test just to see if we have any partial
symbols available. This function returns zero if none are currently
available, nonzero otherwise. */
@@ -688,10 +704,8 @@ have_partial_symbols (void)
ALL_OBJFILES (ofp)
{
- if (ofp->psymtabs != NULL)
- {
- return 1;
- }
+ if (objfile_has_partial_symbols (ofp))
+ return 1;
}
return 0;
}
@@ -707,10 +721,8 @@ have_full_symbols (void)
ALL_OBJFILES (ofp)
{
- if (ofp->symtabs != NULL)
- {
- return 1;
- }
+ if (objfile_has_full_symbols (ofp))
+ return 1;
}
return 0;
}
Index: objfiles.h
===================================================================
RCS file: /cvs/src/src/gdb/objfiles.h,v
retrieving revision 1.59
diff -u -p -r1.59 objfiles.h
--- objfiles.h 15 Jan 2009 16:35:22 -0000 1.59
+++ objfiles.h 10 Jul 2009 21:50:19 -0000
@@ -478,6 +478,10 @@ extern void free_all_objfiles (void);
extern void objfile_relocate (struct objfile *, struct section_offsets *);
+extern int objfile_has_partial_symbols (struct objfile *objfile);
+
+extern int objfile_has_full_symbols (struct objfile *objfile);
+
extern int have_partial_symbols (void);
extern int have_full_symbols (void);
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.121
diff -u -p -r1.121 solib.c
--- solib.c 9 Jul 2009 13:39:17 -0000 1.121
+++ solib.c 10 Jul 2009 21:50:19 -0000
@@ -489,12 +489,12 @@ solib_read_symbols (struct so_list *so,
if (so->symbols_loaded)
{
- if (from_tty)
+ if (from_tty || info_verbose)
printf_unfiltered (_("Symbols already loaded for %s\n"), so->so_name);
}
else if (so->abfd == NULL)
{
- if (from_tty)
+ if (from_tty | info_verbose)
printf_unfiltered (_("Symbol file not found for %s\n"), so->so_name);
}
else
@@ -510,7 +510,7 @@ solib_read_symbols (struct so_list *so,
"Error while reading shared library symbols:\n");
return 0;
}
- if (from_tty && print_symbol_loading)
+ if (from_tty || info_verbose)
printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
so->symbols_loaded = 1;
return 1;
@@ -801,16 +801,26 @@ solib_add (char *pattern, int from_tty,
DESCRIPTION
Walk through the shared library list and print information
- about each attached library.
+ about each attached library matching PATTERN. If PATTERN is elided,
+ print them all.
*/
static void
-info_sharedlibrary_command (char *ignore, int from_tty)
+info_sharedlibrary_command (char *pattern, int from_tty)
{
struct so_list *so = NULL; /* link map state variable */
int header_done = 0;
+ int so_missing_debug_info = 0;
int addr_width;
+ if (pattern)
+ {
+ char *re_err = re_comp (pattern);
+
+ if (re_err)
+ error (_("Invalid regexp: %s"), re_err);
+ }
+
/* "0x", a little whitespace, and two hex digits per byte of pointers. */
addr_width = 4 + (gdbarch_ptr_bit (target_gdbarch) / 4);
@@ -820,6 +830,9 @@ info_sharedlibrary_command (char *ignore
{
if (so->so_name[0])
{
+ if (pattern && ! re_exec (so->so_name))
+ continue;
+
if (!header_done)
{
printf_unfiltered ("%-*s%-*s%-12s%s\n", addr_width, "From",
@@ -840,14 +853,26 @@ info_sharedlibrary_command (char *ignore
(LONGEST) so->addr_high,
addr_width - 4)
: "");
- printf_unfiltered ("%-12s", so->symbols_loaded ? "Yes" : "No");
+
+ if (so->symbols_loaded
+ && !objfile_has_partial_symbols (so->objfile)
+ && !objfile_has_full_symbols (so->objfile))
+ {
+ so_missing_debug_info = 1;
+ printf_unfiltered ("%-12s", "Yes (*)");
+ }
+ else
+ printf_unfiltered ("%-12s", !so->symbols_loaded ? "No" : "Yes");
+
printf_unfiltered ("%s\n", so->so_name);
}
}
if (so_list_head == NULL)
- {
- printf_unfiltered (_("No shared libraries loaded at this time.\n"));
- }
+ printf_unfiltered (_("No shared libraries loaded at this time.\n"));
+ else if (! header_done && pattern)
+ printf_unfiltered (_("No shared libraries matched.\n"));
+ else if (header_done && so_missing_debug_info)
+ printf_unfiltered (_("(*): Shared library is missing debugging information.\n"));
}
/* Return 1 if ADDRESS lies within SOLIB. */
Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.237
diff -u -p -r1.237 symfile.c
--- symfile.c 2 Jul 2009 17:25:58 -0000 1.237
+++ symfile.c 10 Jul 2009 21:50:19 -0000
@@ -171,13 +171,6 @@ Dynamic symbol table reloading multiple
value);
}
-/* If non-zero, gdb will notify the user when it is loading symbols
- from a file. This is almost always what users will want to have happen;
- but for programs with lots of dynamically linked libraries, the output
- can be more noise than signal. */
-
-int print_symbol_loading = 1;
-
/* 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
@@ -989,12 +982,9 @@ symbol_file_add_with_addrs_or_offsets (b
deprecated_pre_add_symbol_hook (name);
else
{
- if (print_symbol_loading)
- {
- printf_unfiltered (_("Reading symbols from %s..."), name);
- wrap_here ("");
- gdb_flush (gdb_stdout);
- }
+ printf_unfiltered (_("Reading symbols from %s..."), name);
+ wrap_here ("");
+ gdb_flush (gdb_stdout);
}
}
syms_from_objfile (objfile, addrs, offsets, num_offsets,
@@ -1007,7 +997,7 @@ symbol_file_add_with_addrs_or_offsets (b
if ((flags & OBJF_READNOW) || readnow_symbol_files)
{
- if ((from_tty || info_verbose) && print_symbol_loading)
+ if (from_tty || info_verbose)
{
printf_unfiltered (_("expanding to full symbols..."));
wrap_here ("");
@@ -1049,15 +1039,12 @@ symbol_file_add_with_addrs_or_offsets (b
xfree (debugfile);
}
- if (!have_partial_symbols () && !have_full_symbols ()
- && print_symbol_loading)
+ if ((from_tty || info_verbose)
+ && !objfile_has_partial_symbols (objfile)
+ && !objfile_has_full_symbols (objfile))
{
wrap_here ("");
- printf_unfiltered (_("(no debugging symbols found)"));
- if (from_tty || info_verbose)
- printf_unfiltered ("...");
- else
- printf_unfiltered ("\n");
+ printf_unfiltered (_("(no debugging symbols found)..."));
wrap_here ("");
}
@@ -1066,10 +1053,7 @@ symbol_file_add_with_addrs_or_offsets (b
if (deprecated_post_add_symbol_hook)
deprecated_post_add_symbol_hook ();
else
- {
- if (print_symbol_loading)
- printf_unfiltered (_("done.\n"));
- }
+ printf_unfiltered (_("done.\n"));
}
/* We print some messages regardless of whether 'from_tty ||
@@ -2422,7 +2406,8 @@ reread_symbols (void)
zero is OK since dbxread.c also does what it needs to do if
objfile->global_psymbols.size is 0. */
(*objfile->sf->sym_read) (objfile, 0);
- if (!have_partial_symbols () && !have_full_symbols ())
+ if (!objfile_has_partial_symbols (objfile)
+ && !objfile_has_full_symbols (objfile))
{
wrap_here ("");
printf_unfiltered (_("(no debugging symbols found)\n"));
@@ -4189,12 +4174,4 @@ the global debug-file directory prepende
NULL,
show_debug_file_directory,
&setlist, &showlist);
-
- add_setshow_boolean_cmd ("symbol-loading", no_class,
- &print_symbol_loading, _("\
-Set printing of symbol loading messages."), _("\
-Show printing of symbol loading messages."), NULL,
- NULL,
- NULL,
- &setprintlist, &showprintlist);
}
Index: symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.51
diff -u -p -r1.51 symfile.h
--- symfile.h 16 Jun 2009 18:49:25 -0000 1.51
+++ symfile.h 10 Jul 2009 21:50:19 -0000
@@ -284,13 +284,6 @@ extern char *obconcat (struct obstack *o
/* Variables */
-/* If non-zero, gdb will notify the user when it is loading symbols
- from a file. This is almost always what users will want to have happen;
- but for programs with lots of dynamically linked libraries, the output
- can be more noise than signal. */
-
-extern int print_symbol_loading;
-
/* 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
Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.605
diff -u -p -r1.605 gdb.texinfo
--- doc/gdb.texinfo 10 Jul 2009 10:35:17 -0000 1.605
+++ doc/gdb.texinfo 10 Jul 2009 22:00:27 -0000
@@ -12565,22 +12565,6 @@ 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 on
-@itemx set print symbol-loading off
-The @code{set print symbol-loading} command allows you to enable or
-disable printing of messages when @value{GDBN} loads symbols.
-By default, these messages will be printed, and normally this is what
-you want. Disabling these messages is useful when debugging applications
-with lots of shared libraries where the quantity of output can be more
-annoying than useful.
-
-@kindex show print symbol-loading
-@item show print symbol-loading
-Show whether messages will be printed when @value{GDBN} loads symbols.
-
@kindex maint print symbols
@cindex symbol dump
@kindex maint print psymbols
@@ -13453,9 +13437,11 @@ command:
@table @code
@kindex info sharedlibrary
@kindex info share
-@item info share
-@itemx info sharedlibrary
-Print the names of the shared libraries which are currently loaded.
+@item info share @var{regex}
+@itemx info sharedlibrary @var{regex}
+Print the names of the shared libraries which are currently loaded
+that match @var{regex}. If @var{regex} is omitted then print
+all shared libraries that are loaded.
@kindex sharedlibrary
@kindex share
More information about the Gdb-patches
mailing list