- build-id warnings integrated more with rpm and the lists of the warnings

got replaced usually by a single-line `debuginfo-install' advice.
- FIXME: Testsuite needs an update for the new pre-prompt messages.
- Fix the `--with upstream' compilation - gstack/pstack are now omitted.
This commit is contained in:
Jan Kratochvil 2008-03-10 10:05:44 +00:00
parent 5bed39139d
commit 338fe930a1
2 changed files with 431 additions and 113 deletions

View File

@ -16,16 +16,22 @@
2008-02-21 Jan Kratochvil <jan.kratochvil@redhat.com>
Rename `debug build-id' to `build-id-verbose'.
Provide its level 0 to disable the build-id messages.
New description of `build-id-verbose' in the documentation.
Resolve the RH Bug 432164.
2008-02-24 Jan Kratochvil <jan.kratochvil@redhat.com>
Port to GDB-6.8pre.
2008-03-09 Jan Kratochvil <jan.kratochvil@redhat.com>
Implement the `debuginfo-install' rpm/yum integration.
Resolve the RH Bug 435581.
Index: gdb-6.7.50.20080227/gdb/Makefile.in
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/Makefile.in 2008-03-01 10:30:49.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/Makefile.in 2008-03-01 10:38:01.000000000 +0100
--- gdb-6.7.50.20080227.orig/gdb/Makefile.in 2008-03-10 00:48:52.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/Makefile.in 2008-03-10 00:48:53.000000000 +0100
@@ -392,7 +392,7 @@ INSTALLED_LIBS=-lbfd -lreadline -lopcode
CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(INTL) $(LIBIBERTY) $(LIBDECNUMBER) \
$(XM_CLIBS) $(TM_CLIBS) $(NAT_CLIBS) $(GDBTKLIBS) @LIBS@ \
@ -45,6 +51,15 @@ Index: gdb-6.7.50.20080227/gdb/Makefile.in
core-regset.o: core-regset.c $(defs_h) $(command_h) $(gdbcore_h) \
$(inferior_h) $(target_h) $(regcache_h) $(gdb_string_h) $(gregset_h)
cp-abi.o: cp-abi.c $(defs_h) $(value_h) $(cp_abi_h) $(command_h) $(gdbcmd_h) \
@@ -2117,7 +2118,7 @@ event-loop.o: event-loop.c $(defs_h) $(e
event-top.o: event-top.c $(defs_h) $(top_h) $(inferior_h) $(target_h) \
$(terminal_h) $(event_loop_h) $(event_top_h) $(interps_h) \
$(exceptions_h) $(cli_script_h) $(gdbcmd_h) $(readline_h) \
- $(readline_history_h)
+ $(readline_history_h) $(symfile_h)
exceptions.o: exceptions.c $(defs_h) $(exceptions_h) $(breakpoint_h) \
$(target_h) $(inferior_h) $(annotate_h) $(ui_out_h) $(gdb_assert_h) \
$(gdb_string_h) $(serial_h)
@@ -2884,7 +2885,8 @@ symfile.o: symfile.c $(defs_h) $(bfdlink
$(gdb_stabs_h) $(gdb_obstack_h) $(completer_h) $(bcache_h) \
$(hashtab_h) $(readline_h) $(gdb_assert_h) $(block_h) \
@ -55,10 +70,19 @@ Index: gdb-6.7.50.20080227/gdb/Makefile.in
symfile-mem.o: symfile-mem.c $(defs_h) $(symtab_h) $(gdbcore_h) \
$(objfiles_h) $(exceptions_h) $(gdbcmd_h) $(target_h) $(value_h) \
$(symfile_h) $(observer_h) $(auxv_h) $(elf_common_h)
@@ -3325,7 +3327,7 @@ tui-hooks.o: $(srcdir)/tui/tui-hooks.c $
tui-interp.o: $(srcdir)/tui/tui-interp.c $(defs_h) $(interps_h) $(top_h) \
$(event_top_h) $(event_loop_h) $(ui_out_h) $(cli_out_h) \
$(tui_data_h) $(readline_h) $(tui_win_h) $(tui_h) $(tui_io_h) \
- $(exceptions_h)
+ $(exceptions_h) $(symfile_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-interp.c
tui-io.o: $(srcdir)/tui/tui-io.c $(defs_h) $(target_h) \
$(event_loop_h) $(event_top_h) $(command_h) $(top_h) $(tui_h) \
Index: gdb-6.7.50.20080227/gdb/corelow.c
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/corelow.c 2008-02-09 14:45:33.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/corelow.c 2008-03-01 10:30:50.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/corelow.c 2008-03-10 00:49:19.000000000 +0100
@@ -45,6 +45,10 @@
#include "exceptions.h"
#include "solib.h"
@ -76,7 +100,7 @@ Index: gdb-6.7.50.20080227/gdb/corelow.c
+static int build_id_core_loads = 1;
+
+static void
+static void
+build_id_locate_exec (int from_tty)
+{
+ CORE_ADDR at_entry;
@ -98,7 +122,7 @@ Index: gdb-6.7.50.20080227/gdb/corelow.c
+ if (exec_filename != NULL)
+ exec_file_attach (exec_filename, from_tty);
+ else
+ build_id_print_missing (_("the main executable file"), build_id_filename);
+ debug_print_missing (_("the main executable file"), build_id_filename);
+ xfree (build_id_filename);
+
+ /* `.note.gnu.build-id' section exists even for files without a separate
@ -115,7 +139,7 @@ Index: gdb-6.7.50.20080227/gdb/corelow.c
+ symbol_file_add_main (exec_filename, from_tty);
+ /* For EXEC_FILENAME NULL we were already complaining above. */
+ if (symfile_objfile == NULL && exec_filename != NULL)
+ build_id_print_missing (exec_filename, build_id_filename);
+ debug_print_missing (exec_filename, build_id_filename);
+ }
+ xfree (build_id_filename);
+
@ -157,8 +181,8 @@ Index: gdb-6.7.50.20080227/gdb/corelow.c
}
Index: gdb-6.7.50.20080227/gdb/doc/gdb.texinfo
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/doc/gdb.texinfo 2008-03-01 10:30:50.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/doc/gdb.texinfo 2008-03-01 10:38:02.000000000 +0100
--- gdb-6.7.50.20080227.orig/gdb/doc/gdb.texinfo 2008-03-10 00:48:52.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/doc/gdb.texinfo 2008-03-10 00:49:42.000000000 +0100
@@ -12208,6 +12208,27 @@ information files.
@end table
@ -167,7 +191,7 @@ Index: gdb-6.7.50.20080227/gdb/doc/gdb.texinfo
+
+@table @code
+
+@kindex set build-id-verbose
+@kindex set build-id-verbose
+@item set build-id-verbose 0
+No additional messages are printed.
+
@ -187,10 +211,40 @@ Index: gdb-6.7.50.20080227/gdb/doc/gdb.texinfo
@cindex @code{.gnu_debuglink} sections
@cindex debug link sections
A debug link is a special section of the executable file named
Index: gdb-6.7.50.20080227/gdb/event-top.c
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/event-top.c 2008-01-01 23:53:09.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/event-top.c 2008-03-10 00:48:53.000000000 +0100
@@ -31,6 +31,7 @@
#include <signal.h>
#include "exceptions.h"
#include "cli/cli-script.h" /* for reset_command_nest_depth */
+#include "symfile.h"
/* For dont_repeat() */
#include "gdbcmd.h"
@@ -192,6 +193,8 @@ cli_command_loop (void)
char *a_prompt;
char *gdb_prompt = get_prompt ();
+ debug_flush_missing ();
+
/* Tell readline what the prompt to display is and what function it
will need to call after a whole line is read. This also displays
the first prompt. */
@@ -263,6 +266,8 @@ display_gdb_prompt (char *new_prompt)
/* Reset the nesting depth used when trace-commands is set. */
reset_command_nest_depth ();
+ debug_flush_missing ();
+
/* Each interpreter has its own rules on displaying the command
prompt. */
if (!current_interp_display_prompt_p ())
Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/solib-svr4.c 2008-03-01 10:30:48.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/solib-svr4.c 2008-03-01 10:30:50.000000000 +0100
--- gdb-6.7.50.20080227.orig/gdb/solib-svr4.c 2008-03-10 00:48:51.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/solib-svr4.c 2008-03-10 00:48:53.000000000 +0100
@@ -967,9 +967,34 @@ svr4_current_sos (void)
free_so (new);
else
@ -220,8 +274,8 @@ Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
+ xfree (name);
+ }
+ else
+ build_id_print_missing (new->so_name,
+ build_id_filename);
+ debug_print_missing (new->so_name, build_id_filename);
+
+ xfree (build_id_filename);
+ xfree (build_id);
+ }
@ -231,8 +285,8 @@ Index: gdb-6.7.50.20080227/gdb/solib-svr4.c
fprintf_unfiltered (gdb_stdlog,
Index: gdb-6.7.50.20080227/gdb/symfile.c
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/symfile.c 2008-03-01 10:30:48.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/symfile.c 2008-03-01 10:47:02.000000000 +0100
--- gdb-6.7.50.20080227.orig/gdb/symfile.c 2008-03-10 00:48:51.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/symfile.c 2008-03-10 00:49:33.000000000 +0100
@@ -54,6 +54,9 @@
#include "varobj.h"
#include "elf-bfd.h"
@ -717,7 +771,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
if (retval != NULL && !build_id_verify (retval, build_id))
{
@@ -1323,9 +1723,202 @@ build_id_to_debug_filename (struct build
@@ -1323,9 +1723,433 @@ build_id_to_debug_filename (struct build
retval = NULL;
}
@ -735,151 +789,378 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
+#include <rpm/rpmdb.h>
+#include <rpm/header.h>
+
+static void
+rpm_print_debuginfo (const char *filename)
+/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files
+ and avoid their duplicities during a single inferior run. */
+
+static struct htab *missing_rpm_hash;
+
+/* This MISSING_RPM_LIST tracker is used to collect and print as a single line
+ all the rpms right before the nearest GDB prompt. It gets cleared after
+ each such print (it is questionable if we should clear it after the print).
+ */
+
+struct missing_rpm
+ {
+ struct missing_rpm *next;
+ char rpm[1];
+ };
+static struct missing_rpm *missing_rpm_list;
+static int missing_rpm_list_entries;
+
+/* Returns the count of newly added rpms. */
+
+static int
+missing_rpm_enlist (const char *filename)
+{
+ static int rpm_init_done = 0;
+ rpmts ts;
+ rpmdbMatchIterator mi;
+ int count = 0;
+
+ if (filename == NULL)
+ return 0;
+
+ if (!rpm_init_done)
+ {
+ if (rpmReadConfigFiles(NULL, NULL) != 0)
+ {
+ warning (_("Error reading the rpm configuration files"));
+ return;
+ return 0;
+ }
+ rpm_init_done = 1;
+ }
+
+ ts = rpmtsCreate ();
+
+
+ mi = rpmtsInitIterator (ts, RPMTAG_BASENAMES, filename, 0);
+ if (mi != NULL)
+ {
+ int printed = 0;
+
+ for (;;)
+ {
+ Header h;
+ char *s;
+ const char *errmsg;
+ char *s, *srcrpm, *verrel, *debuginfo;
+ union
+ {
+ void *voidp;
+ char *s;
+ }
+ sourcerpm, arch;
+ char **slot;
+ rpmdbMatchIterator mi_debuginfo;
+
+ h = rpmdbNextIterator (mi);
+ if (h == NULL)
+ break;
+
+ s = headerSprintf (h, " %{name}", rpmTagTable, rpmHeaderFormats,
+ &errmsg);
+ if (s == NULL)
+ warning (_("Error querying rpm file `%s': %s"), filename, errmsg);
+ else
+ if (!headerGetEntry (h, RPMTAG_SOURCERPM, NULL, &sourcerpm.voidp,
+ NULL))
+ {
+ if (!printed)
+ {
+ fprintf_unfiltered (gdb_stdout,
+ _("Getting all the debuginfos: %s"),
+ "debuginfo-install");
+ printed = 1;
+ }
+ /* Space (' ') delimited was insted by HEADERSPRINTF above. */
+ fputs_unfiltered (s, gdb_stdout);
+ warning (_("Error querying the rpm file `%s' %s"), filename,
+ "RPMTAG_SOURCERPM");
+ continue;
+ }
+ }
+ srcrpm = sourcerpm.s + strlen (sourcerpm.s) - (sizeof ".src.rpm" - 1);
+ if (srcrpm < sourcerpm.s || strcmp (srcrpm, ".src.rpm") != 0)
+ {
+error_parsing_sourcerpm:
+ warning (_("Error parsing %%{sourcerpm} of the rpm file `%s': %s"),
+ filename, sourcerpm.s);
+ continue;
+ }
+ s = srcrpm;
+
+ if (printed)
+ fputs_unfiltered ("\n", gdb_stdout);
+ /* Skip the release. */
+
+ while (s > sourcerpm.s && s[-1] != '-')
+ s--;
+ if (s == sourcerpm.s)
+ goto error_parsing_sourcerpm;
+ s--;
+
+ /* Skip the version. */
+
+ while (s > sourcerpm.s && s[-1] != '-')
+ s--;
+ if (s == sourcerpm.s)
+ goto error_parsing_sourcerpm;
+ s--;
+ verrel = s;
+
+ if (!headerGetEntry (h, RPMTAG_ARCH, NULL, &arch.voidp, NULL))
+ {
+ warning (_("Error querying the rpm file `%s' %s"), filename,
+ "RPMTAG_ARCH");
+ continue;
+ }
+
+ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */
+
+ debuginfo = xmalloc (strlen (sourcerpm.s) + strlen (arch.s) + 32);
+
+ /* Verify the debuginfo file is not already installed. */
+
+ sprintf (debuginfo, "%.*s-debuginfo%.*s.%s",
+ (int) (verrel - sourcerpm.s), sourcerpm.s,
+ (int) (srcrpm - verrel), verrel, arch.s);
+ mi_debuginfo = rpmtsInitIterator (ts, RPMDBI_LABEL, debuginfo, 0);
+ if (mi_debuginfo != NULL)
+ {
+ Header h_debuginfo;
+
+ h_debuginfo = rpmdbNextIterator (mi_debuginfo);
+ rpmdbFreeIterator (mi_debuginfo);
+ if (h_debuginfo != NULL)
+ {
+ xfree (debuginfo);
+
+ /* We ignore any != 0 for possibly already enlisted rpms as
+ it should not hurt much. */
+
+ count = 0;
+ break;
+ }
+ }
+
+ /* Base package name for `debuginfo-install'. We do not use `yum'
+ as its command
+ yum --enablerepo='*-debuginfo' install BASE-debuginfo.ARCH
+ would be more complicated than just:
+ debuginfo-install BASE.ARCH
+ We do not need to supply the version-release as
+ `debuginfo-install' always installs only the debuginfo matching
+ the currently installed rpm. Still we must supply `.%{arch}' as
+ we may have multilib (multiple arch-differing rpm packages)
+ installed.
+ FUTURE: After multiple debuginfo versions simultaneously installed
+ get supported we may need to supply the version-release here. */
+
+ sprintf (debuginfo, "%.*s.%s", (int) (verrel - sourcerpm.s),
+ sourcerpm.s, arch.s);
+
+ if (missing_rpm_hash == NULL)
+ {
+ /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE
+ should not deallocate the entries. */
+
+ missing_rpm_hash = htab_create_alloc (64, htab_hash_string,
+ (int (*) (const void *, const void *)) streq,
+ NULL, xcalloc, xfree);
+ }
+ slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT);
+ /* XCALLOC never returns NULL. */
+ gdb_assert (slot != NULL);
+ if (*slot == NULL)
+ {
+ struct missing_rpm *missing_rpm;
+
+ *slot = debuginfo;
+
+ missing_rpm = xmalloc (sizeof (*missing_rpm) + strlen (debuginfo));
+ strcpy (missing_rpm->rpm, debuginfo);
+ missing_rpm->next = missing_rpm_list;
+ missing_rpm_list = missing_rpm;
+ missing_rpm_list_entries++;
+ }
+ else
+ xfree (debuginfo);
+ count++;
+ }
+
+ rpmdbFreeIterator (mi);
+ }
+
+ rpmtsFree (ts);
+
+ return count;
+}
+
+struct missing_debuginfos
+static int
+missing_rpm_list_compar (const char *const *ap, const char *const *bp)
+{
+ return strcoll (*ap, *bp);
+}
+
+/* It returns a NULL-terminated array of strings needing to be FREEd. It may
+ also return only NULL. */
+
+static void
+missing_rpm_list_print (void)
+{
+ char **array, **array_iter;
+ struct missing_rpm *list_iter;
+
+ if (missing_rpm_list_entries == 0)
+ return;
+
+ array = xmalloc (sizeof (*array) * missing_rpm_list_entries);
+ array_iter = array;
+ for (list_iter = missing_rpm_list; list_iter != NULL;
+ list_iter = list_iter->next)
+ {
+ *array_iter++ = list_iter->rpm;
+ }
+ gdb_assert (array_iter == array + missing_rpm_list_entries);
+
+ qsort (array, missing_rpm_list_entries, sizeof (*array),
+ (int (*) (const void *, const void *)) missing_rpm_list_compar);
+
+ printf (_("Missing separate debuginfos, use: %s"), "debuginfo-install");
+ for (array_iter = array; array_iter < array + missing_rpm_list_entries;
+ array_iter++)
+ {
+ putchar (' ');
+ fputs (*array_iter, stdout);
+ }
+ putchar ('\n');
+
+ xfree (array);
+ while (missing_rpm_list != NULL)
+ {
+ list_iter = missing_rpm_list;
+ missing_rpm_list = list_iter->next;
+ xfree (list_iter);
+ }
+ missing_rpm_list_entries = 0;
+}
+
+static void
+missing_rpm_change (void)
+{
+ debug_flush_missing ();
+
+ gdb_assert (missing_rpm_list == NULL);
+ if (missing_rpm_hash != NULL)
+ {
+ htab_delete (missing_rpm_hash);
+ missing_rpm_hash = NULL;
+ }
+}
+
+enum missing_exec
+ {
+ /* Init state. EXEC_BFD also still could be NULL. */
+ MISSING_EXEC_NOT_TRIED,
+ /* We saw a non-NULL EXEC_BFD but RPM has no info about it. */
+ MISSING_EXEC_NOT_FOUND,
+ /* We found EXEC_BFD by RPM and we either have its symbols (either embedded
+ or separate) or the main executable's RPM is now contained in
+ MISSING_RPM_HASH. */
+ MISSING_EXEC_ENLISTED
+ };
+static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED;
+
+void
+debug_flush_missing (void)
+{
+ missing_rpm_list_print ();
+}
+
+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages
+ yum --enablerepo='*-debuginfo' install ...
+ avoidance. */
+
+struct missing_filepair
+ {
+ char *binary;
+ char *debug;
+ char data[1];
+ };
+
+static struct htab *missing_debuginfos_hash;
+static struct obstack missing_debuginfos_obstack;
+static struct htab *missing_filepair_hash;
+static struct obstack missing_filepair_obstack;
+
+static void *
+missing_debuginfos_xcalloc (size_t nmemb, size_t nmemb_size)
+missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size)
+{
+ void *retval;
+ size_t size = nmemb * nmemb_size;
+
+ retval = obstack_alloc (&missing_debuginfos_obstack, size);
+
+ retval = obstack_alloc (&missing_filepair_obstack, size);
+ memset (retval, 0, size);
+ return retval;
+}
+
+static hashval_t
+missing_debuginfos_hash_func (const struct missing_debuginfos *elem)
+missing_filepair_hash_func (const struct missing_filepair *elem)
+{
+ return htab_hash_string (elem->binary) ^ htab_hash_string (elem->debug);
+ hashval_t retval = 0;
+
+ retval ^= htab_hash_string (elem->binary);
+ if (elem->debug != NULL)
+ retval ^= htab_hash_string (elem->debug);
+
+ return retval;
+}
+
+static int
+missing_debuginfos_eq (const struct missing_debuginfos *elem1,
+ const struct missing_debuginfos *elem2)
+missing_filepair_eq (const struct missing_filepair *elem1,
+ const struct missing_filepair *elem2)
+{
+ return strcmp (elem1->binary, elem2->binary) == 0
+ && strcmp (elem1->debug, elem2->debug) == 0;
+ && ((elem1->debug == NULL && elem2->debug == NULL)
+ || strcmp (elem1->debug, elem2->debug) == 0);
+}
+
+static void
+missing_debuginfos_change (void)
+missing_filepair_change (void)
+{
+ if (missing_debuginfos_hash != NULL)
+ if (missing_filepair_hash != NULL)
+ {
+ obstack_free (&missing_debuginfos_obstack, NULL);
+ /* All their memory came just from MISSING_DEBUGINFOS_OBSTACK. */
+ missing_debuginfos_hash = NULL;
+ obstack_free (&missing_filepair_obstack, NULL);
+ /* All their memory came just from missing_filepair_OBSTACK. */
+ missing_filepair_hash = NULL;
+ }
+ missing_exec = MISSING_EXEC_NOT_TRIED;
+}
+
+static void
+missing_debuginfos_change_inferior_created (struct target_ops *objfile,
+ int from_tty)
+debug_print_executable_changed (void *unused)
+{
+ missing_debuginfos_change ();
+ missing_rpm_change ();
+ missing_filepair_change ();
+}
+
+/* Notify user the file BINARY with (possibly NULL) associated separate debug
+ information file DEBUG is missing. DEBUG may or may not be the build-id
+ file such as would be:
+ /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug
+ */
+
+void
+build_id_print_missing (const char *binary, const char *debug)
+debug_print_missing (const char *binary, const char *debug)
+{
+ char *exec_filename = NULL;
+ size_t binary_len0 = strlen (binary) + 1;
+ size_t debug_len0 = strlen (debug) + 1;
+ struct missing_debuginfos *missing_debuginfos;
+ struct missing_debuginfos **slot;
+ size_t debug_len0 = debug ? strlen (debug) + 1 : 0;
+ struct missing_filepair *missing_filepair;
+ struct missing_filepair **slot;
+
+ if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES)
+ return;
+
+ if (missing_debuginfos_hash == NULL)
+ if (missing_filepair_hash == NULL)
+ {
+ obstack_init (&missing_debuginfos_obstack);
+ missing_debuginfos_hash = htab_create_alloc (64,
+ (hashval_t (*) (const void *)) missing_debuginfos_hash_func,
+ (int (*) (const void *, const void *)) missing_debuginfos_eq, NULL,
+ missing_debuginfos_xcalloc, NULL);
+ obstack_init (&missing_filepair_obstack);
+ missing_filepair_hash = htab_create_alloc (64,
+ (hashval_t (*) (const void *)) missing_filepair_hash_func,
+ (int (*) (const void *, const void *)) missing_filepair_eq, NULL,
+ missing_filepair_xcalloc, NULL);
+ }
+
+ missing_debuginfos = obstack_alloc (&missing_debuginfos_obstack,
+ sizeof (*missing_debuginfos) - 1
+ missing_filepair = obstack_alloc (&missing_filepair_obstack,
+ sizeof (*missing_filepair) - 1
+ + binary_len0 + debug_len0);
+ missing_debuginfos->binary = missing_debuginfos->data;
+ memcpy (missing_debuginfos->binary, binary, binary_len0);
+ missing_debuginfos->debug = missing_debuginfos->binary + binary_len0;
+ memcpy (missing_debuginfos->debug, debug, debug_len0);
+ missing_filepair->binary = missing_filepair->data;
+ memcpy (missing_filepair->binary, binary, binary_len0);
+ if (debug != NULL)
+ {
+ missing_filepair->debug = missing_filepair->binary + binary_len0;
+ memcpy (missing_filepair->debug, debug, debug_len0);
+ }
+ else
+ missing_filepair->debug = NULL;
+
+ slot = (struct missing_debuginfos **) htab_find_slot (missing_debuginfos_hash,
+ missing_debuginfos,
+ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash,
+ missing_filepair,
+ INSERT);
+
+ /* While it may be still printed duplicitely with the missing debuginfo file
@ -889,38 +1170,42 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
+
+ if (*slot != NULL)
+ {
+ obstack_free (&missing_debuginfos_obstack, missing_debuginfos);
+ obstack_free (&missing_filepair_obstack, missing_filepair);
+ return;
+ }
+ *slot = missing_debuginfos;
+ *slot = missing_filepair;
+
+ fprintf_unfiltered (gdb_stdlog, _("Missing separate debuginfo for %s\n"),
+ binary);
+
+ fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
+ "yum --enablerepo='*-debuginfo' install", debug);
+
+ if (exec_bfd != NULL)
+ exec_filename = bfd_get_filename (exec_bfd);
+ if (exec_filename != NULL)
+ if (missing_exec == MISSING_EXEC_NOT_TRIED)
+ {
+ static char *last_exec_filename;
+ char *exec_filename;
+
+ if (last_exec_filename == NULL
+ || strcmp (exec_filename, last_exec_filename) != 0)
+ exec_filename = get_exec_file (0);
+ if (exec_filename != NULL)
+ {
+ xfree (last_exec_filename);
+ last_exec_filename = xstrdup (exec_filename);
+
+ rpm_print_debuginfo (exec_filename);
+ if (missing_rpm_enlist (exec_filename) == 0)
+ missing_exec = MISSING_EXEC_NOT_FOUND;
+ else
+ missing_exec = MISSING_EXEC_ENLISTED;
+ }
+ }
+ if (missing_exec != MISSING_EXEC_ENLISTED)
+ if (missing_rpm_enlist (binary) == 0 && missing_rpm_enlist (debug) == 0)
+ {
+ /* We do not collect and flush these messages as each such message
+ already requires its own separate lines. */
+
+ fprintf_unfiltered (gdb_stdlog,
+ _("Missing separate debuginfo for %s\n"), binary);
+ if (debug != NULL)
+ fprintf_unfiltered (gdb_stdlog, _("Try: %s %s\n"),
+ "yum --enablerepo='*-debuginfo' install", debug);
+ }
+}
+
static char *
get_debug_link_info (struct objfile *objfile, unsigned long *crc32_out)
{
@@ -1411,32 +2004,36 @@ static char *
@@ -1411,32 +2235,36 @@ static char *
find_separate_debug_file (struct objfile *objfile)
{
asection *sect;
@ -966,7 +1251,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
}
basename = get_debug_link_info (objfile, &crc32);
@@ -1444,7 +2041,7 @@ find_separate_debug_file (struct objfile
@@ -1444,7 +2272,7 @@ find_separate_debug_file (struct objfile
if (basename == NULL)
/* There's no separate debug info, hence there's no way we could
load it => no warning. */
@ -975,7 +1260,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
dir = xstrdup (objfile->name);
@@ -1460,23 +2057,19 @@ find_separate_debug_file (struct objfile
@@ -1460,23 +2288,19 @@ find_separate_debug_file (struct objfile
gdb_assert (i >= 0 && IS_DIR_SEPARATOR (dir[i]));
dir[i+1] = '\0';
@ -1006,7 +1291,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
/* Then try in the subdirectory named DEBUG_SUBDIRECTORY. */
strcpy (debugfile, dir);
@@ -1485,11 +2078,7 @@ find_separate_debug_file (struct objfile
@@ -1485,11 +2309,7 @@ find_separate_debug_file (struct objfile
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
@ -1019,7 +1304,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
/* Then try in the global debugfile directory. */
strcpy (debugfile, debug_file_directory);
@@ -1498,11 +2087,7 @@ find_separate_debug_file (struct objfile
@@ -1498,11 +2318,7 @@ find_separate_debug_file (struct objfile
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
@ -1032,7 +1317,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
/* If the file is in the sysroot, try using its base path in the
global debugfile directory. */
@@ -1517,20 +2102,19 @@ find_separate_debug_file (struct objfile
@@ -1517,20 +2333,18 @@ find_separate_debug_file (struct objfile
strcat (debugfile, basename);
if (separate_debug_file_exists (debugfile, crc32, objfile->name))
@ -1049,8 +1334,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
- xfree (canon_name);
+ debugfile = NULL;
+ if (build_id_filename != NULL)
+ build_id_print_missing (objfile->name, build_id_filename);
+ debug_print_missing (objfile->name, build_id_filename);
+
+cleanup_return_debugfile:
+ xfree (build_id_filename);
@ -1062,7 +1346,7 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
}
@@ -4220,4 +4804,16 @@ the global debug-file directory prepende
@@ -4220,4 +5034,16 @@ the global debug-file directory prepende
NULL,
show_debug_file_directory,
&setlist, &showlist);
@ -1077,13 +1361,13 @@ Index: gdb-6.7.50.20080227/gdb/symfile.c
+ show_build_id_verbose,
+ &setlist, &showlist);
+
+ observer_attach_inferior_created (missing_debuginfos_change_inferior_created);
+ observer_attach_executable_changed (debug_print_executable_changed);
}
Index: gdb-6.7.50.20080227/gdb/symfile.h
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/symfile.h 2008-02-03 23:13:29.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/symfile.h 2008-03-01 10:30:50.000000000 +0100
@@ -358,6 +358,13 @@ extern int symfile_map_offsets_to_segmen
+++ gdb-6.7.50.20080227/gdb/symfile.h 2008-03-10 00:48:53.000000000 +0100
@@ -358,6 +358,14 @@ extern int symfile_map_offsets_to_segmen
struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
void free_symfile_segment_data (struct symfile_segment_data *data);
@ -1092,8 +1376,30 @@ Index: gdb-6.7.50.20080227/gdb/symfile.h
+extern struct build_id *build_id_addr_get (CORE_ADDR addr);
+extern char *build_id_to_filename (struct build_id *build_id,
+ char **link_return, int add_debug_suffix);
+extern void build_id_print_missing (const char *binary, const char *debug);
+extern void debug_print_missing (const char *binary, const char *debug);
+extern void debug_flush_missing (void);
+
/* From dwarf2read.c */
extern int dwarf2_has_info (struct objfile *);
Index: gdb-6.7.50.20080227/gdb/tui/tui-interp.c
===================================================================
--- gdb-6.7.50.20080227.orig/gdb/tui/tui-interp.c 2008-01-01 23:53:22.000000000 +0100
+++ gdb-6.7.50.20080227/gdb/tui/tui-interp.c 2008-03-10 00:48:53.000000000 +0100
@@ -30,6 +30,7 @@
#include "tui/tui.h"
#include "tui/tui-io.h"
#include "exceptions.h"
+#include "symfile.h"
/* Set to 1 when the TUI mode must be activated when we first start
gdb. */
@@ -128,6 +129,8 @@ tui_command_loop (void *data)
char *a_prompt;
char *gdb_prompt = get_prompt ();
+ debug_flush_missing ();
+
/* Tell readline what the prompt to display is and what function
it will need to call after a whole line is read. This also
displays the first prompt. */

View File

@ -13,7 +13,7 @@ Version: 6.7.50.20080227
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
Release: 2%{?_with_upstream:.upstream}%{?dist}
Release: 3%{?_with_upstream:.upstream}%{?dist}
License: GPL
Group: Development/Debuggers
@ -38,9 +38,11 @@ URL: http://gnu.org/software/gdb/
Obsoletes: gdb64 < 5.3.91
%endif
%if 0%{!?_with_upstream:1}
# The last Rawhide release was (no dist tag) pstack-1.2-7.2.2
Obsoletes: pstack < 1.2-7.2.2.1
Provides: pstack = 1.2-7.2.2.1
%endif # 1%{?_with_upstream:0}
# GDB patches have the format `gdb-<version>-bz<red-hat-bz-#>-<desc>.patch'.
# They should be created using patch level 1: diff -up ./gdb (or gdb-6.3/gdb).
@ -685,11 +687,13 @@ rm -rf $RPM_BUILD_ROOT/%{_libdir}/lib{bfd*,opcodes*,iberty*,mmalloc*}
rm -f $RPM_BUILD_ROOT%{_infodir}/dir
%if 0%{!?_with_upstream:1}
# pstack obsoletion
cp -p %{SOURCE3} $RPM_BUILD_ROOT%{_mandir}/man1/gstack.1
ln -s gstack.1.gz $RPM_BUILD_ROOT%{_mandir}/man1/pstack.1.gz
ln -s gstack $RPM_BUILD_ROOT%{_bindir}/pstack
%endif # 1%{?_with_upstream:0}
%clean
rm -rf $RPM_BUILD_ROOT
@ -717,12 +721,14 @@ fi
%{_bindir}/gcore
%{_bindir}/gdb
%{_bindir}/gdbtui
%{_bindir}/gstack
%{_bindir}/pstack
%{_mandir}/*/gdb.1*
%{_mandir}/*/gdbtui.1*
%if 0%{!?_with_upstream:1}
%{_bindir}/gstack
%{_bindir}/pstack
%{_mandir}/*/gstack.1*
%{_mandir}/*/pstack.1*
%endif # 1%{?_with_upstream:0}
%{_infodir}/annotate.info*
%{_infodir}/gdb.info*
%{_infodir}/gdbint.info*
@ -735,6 +741,12 @@ fi
%{_mandir}/*/gdbserver.1*
%changelog
* Mon Mar 10 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.7.50.20080227-3
- build-id warnings integrated more with rpm and the lists of the warnings got
replaced usually by a single-line `debuginfo-install' advice.
- FIXME: Testsuite needs an update for the new pre-prompt messages.
- Fix the `--with upstream' compilation - gstack/pstack are now omitted.
* Tue Mar 4 2008 Jan Kratochvil <jan.kratochvil@redhat.com> - 6.7.50.20080227-2
- Drop the unused `ChangeLog.RedHat' file stubs.
- New rpm option `--with upstream' to drop the Fedora patches for testing.