This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add "set debug minsyms" command


While discussing this issue:

  https://sourceware.org/ml/gdb-patches/2018-12/threads.html#00082

I added a printf to be able to quickly see all minimal symbols recorded
by GDB.  I thought it would be useful to have it built-in, for the
future.

The output isn't particularly pretty.  I found it more readable when making
sure the fields were vertically aligned, which results in a lot of space wasted
in the "type" column (the width is based on the length of the longest
enumerator):

  minsym: recording minsym type: mst_data               addr: 0x00000000004047c0  section: 2      name: __rt_psrelocs_end
  minsym: recording minsym type: mst_text               addr: 0x0000000000402b88  section: 0      name: exit

But since this is just debugging output, I think it doesn't really
matter.

Also, I didn't use paddress to print the address, because:

1. There is no gdbarch handy at this point
2. The address may not actually be an address, but any numerical value.
   Printing with paddress could change how it's displayed (e.g. mask
   certain bits) and could be misleading.  I think it's better to print
   the actual raw value saved in the minimal symbol.

gdb/ChangeLog:

	* minsyms.c: Include cli/cli-cmds.h.
	(debug_minsyms): New.
	(mst_str): New.
	(minimal_symbol_reader::record_full): Add debug output.
	(_initialize_minsyms): New.
---
 gdb/auto-load.c |  2 ++
 gdb/elfread.c   |  2 ++
 gdb/minsyms.c   | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+)

diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 33d282afe83..e35fd29426b 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -1175,6 +1175,8 @@ load_auto_scripts_for_objfile (struct objfile *objfile)
 static void
 auto_load_new_objfile (struct objfile *objfile)
 {
+  std::vector <int> c;
+  c.clear();
   if (!objfile)
     {
       /* OBJFILE is NULL when loading a new "main" symbol-file.  */
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 71e6fcca6ec..359089b166c 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -249,6 +249,8 @@ elf_symtab_read (minimal_symbol_reader &reader,
 	  continue;
 	}
 
+      printf(" --- %s\n", sym->name);
+
       /* Skip "special" symbols, e.g. ARM mapping symbols.  These are
 	 symbols which do not correspond to objects in the symbol table,
 	 but have some other target-specific meaning.  */
diff --git a/gdb/minsyms.c b/gdb/minsyms.c
index 0f854422e0f..98ce969eed0 100644
--- a/gdb/minsyms.c
+++ b/gdb/minsyms.c
@@ -53,6 +53,10 @@
 #include "symbol.h"
 #include <algorithm>
 #include "safe-ctype.h"
+#include "cli/cli-cmds.h"
+
+/* Value of the "set debug minsyms" configuration variable.  */
+static int debug_minsyms = 0;
 
 /* See minsyms.h.  */
 
@@ -1080,6 +1084,33 @@ minimal_symbol_reader::record (const char *name, CORE_ADDR address,
   record_with_info (name, address, ms_type, section);
 }
 
+/* Convert an enumerator of type minimal_symbol_type to its string
+   representation.  */
+
+static const char *
+mst_str (minimal_symbol_type t)
+{
+#define MST_TO_STR(x) case x: return #x;
+  switch (t)
+  {
+    MST_TO_STR (mst_unknown);
+    MST_TO_STR (mst_text);
+    MST_TO_STR (mst_text_gnu_ifunc);
+    MST_TO_STR (mst_slot_got_plt);
+    MST_TO_STR (mst_data);
+    MST_TO_STR (mst_bss);
+    MST_TO_STR (mst_abs);
+    MST_TO_STR (mst_solib_trampoline);
+    MST_TO_STR (mst_file_text);
+    MST_TO_STR (mst_file_data);
+    MST_TO_STR (mst_file_bss);
+
+    default:
+      return "mst_???";
+  }
+#undef MST_TO_STR
+}
+
 /* See minsyms.h.  */
 
 struct minimal_symbol *
@@ -1112,6 +1143,11 @@ minimal_symbol_reader::record_full (const char *name, int name_len,
   if (ms_type == mst_file_text && startswith (name, "__gnu_compiled"))
     return (NULL);
 
+  if (debug_minsyms)
+    printf_unfiltered
+      ("minsym: recording minsym type: %-21s  addr: 0x%016llx  section: %-5d  name: %s\n",
+       mst_str (ms_type), (long long) address, section, name);
+
   if (m_msym_bunch_index == BUNCH_SIZE)
     {
       newobj = XCNEW (struct msym_bunch);
@@ -1531,3 +1567,15 @@ minimal_symbol_upper_bound (struct bound_minimal_symbol minsym)
 
   return result;
 }
+
+void
+_initialize_minsyms (void)
+{
+  add_setshow_boolean_cmd ("minsyms", class_maintenance,
+			   &debug_minsyms, _("\
+Set minimal symbols debugging."), _("\
+Show minimal symbols debugging."), _("\
+When non-zero, debugging output related to minimal symbol is displayed."),
+			    NULL, NULL,
+			    &setdebuglist, &showdebuglist);
+}
-- 
2.20.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]