[PATCH] gdb: New maint info line-table command.
Andrew Burgess
andrew.burgess@embecosm.com
Sat Feb 6 22:16:00 GMT 2016
Add a new command 'maint info line-table' to display the contents of
GDB's internal line table structure. Useful when trying to understand
problems (within gdb) relating to line tables.
gdb/ChangeLog:
* symmisc.c (maintenance_info_line_tables): New function.
(_initialize_symmisc): Register 'maint info line-table' command.
* NEWS: Mention new command.
gdb/doc/ChangeLog:
* gdb.texinfo (Symbols): Document new 'maint info line-table'
command.
gdb/testsuite/ChangeLog:
* gdb.base/maint.exp: New tests for 'maint info line-table'.
---
gdb/ChangeLog | 6 +++
gdb/NEWS | 3 ++
gdb/doc/ChangeLog | 5 +++
gdb/doc/gdb.texinfo | 9 +++++
gdb/symmisc.c | 84 ++++++++++++++++++++++++++++++++++++++++
gdb/testsuite/ChangeLog | 4 ++
gdb/testsuite/gdb.base/maint.exp | 16 ++++++++
7 files changed, 127 insertions(+)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a2b0d39..03366d3 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * symmisc.c (maintenance_info_line_tables): New function.
+ (_initialize_symmisc): Register 'maint info line-table' command.
+ * NEWS: Mention new command.
+
2016-02-04 Yao Qi <yao.qi@linaro.org>
* remote.c (remote_wait_as): Set rs->waiting_for_stop_reply to
diff --git a/gdb/NEWS b/gdb/NEWS
index 962eae4..b868791 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -98,6 +98,9 @@ maint set bfd-sharing
maint show bfd-sharing
Control the reuse of bfd objects.
+maint info line-table FILENAME
+ Display the contents of GDB's internal line table data struture.
+
set debug bfd-cache
show debug bfd-cache
Control display of debugging info regarding bfd caching.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 05d2694..64465ba 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Symbols): Document new 'maint info line-table'
+ command.
+
2016-02-01 Doug Evans <dje@google.com>
* gdb.texinfo (Value Sizes): Fix typo.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 2d09d13..c6aa683 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -17066,6 +17066,15 @@ line 1574.
(@value{GDBP})
@end smallexample
+@kindex maint info line-table
+@cindex listing @value{GDBN}'s internal line tables
+@cindex line tables, listing @value{GDBN}'s internal
+@item maint info line-table @var{filename}
+
+List the @code{struct linetable} for the symtab with @var{filename}.
+If @var{filename} is not given then the the @code{struct linetable}
+that contains the current @var{pc} is given.
+
@kindex maint set symbol-cache-size
@cindex symbol cache size
@item maint set symbol-cache-size @var{size}
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 69b7e8e..eac7925 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -949,6 +949,84 @@ block_depth (struct block *block)
}
+/* Implement the 'maint info line-table' command. */
+
+static void
+maintenance_info_line_tables (char *arg, int from_tty)
+{
+ struct ui_out *uiout = current_uiout;
+ struct symtab *symtab = NULL;
+ struct linetable *linetable;
+ struct cleanup *table_cleanup;
+ int i;
+
+ if (arg != NULL)
+ symtab = lookup_symtab (arg);
+ else
+ {
+ struct frame_info *frame;
+ CORE_ADDR pc;
+
+ frame = get_selected_frame (_("No frame selected."));
+ pc = get_frame_address_in_block (frame);
+ symtab = find_pc_line_symtab (pc);
+ }
+
+ if (symtab == NULL)
+ {
+ if (arg)
+ error (_("No matching symbol table found for `%s'."), arg);
+ else
+ error (_("No matching symbol table found."));
+ }
+
+ linetable = SYMTAB_LINETABLE (symtab);
+ if (linetable == NULL)
+ error (_("Symbol table for `%s' has no line table."),
+ symtab_to_filename_for_display (symtab));
+ if (linetable->nitems <= 0)
+ error (_("Line table for symbol table `%s' has no lines"),
+ symtab_to_filename_for_display (symtab));
+
+ ui_out_text (uiout, "Line table for `");
+ ui_out_text (uiout, symtab_to_filename_for_display (symtab));
+ ui_out_text (uiout, "':\n");
+
+ table_cleanup
+ = make_cleanup_ui_out_table_begin_end (uiout, 3,
+ linetable->nitems,
+ "line-table");
+
+ /* Leave space for 6 digits of index and line number. After that the
+ tables will just not format as well. */
+ ui_out_table_header (uiout, 6, ui_left, "index", "INDEX");
+ ui_out_table_header (uiout, 6, ui_right, "line", "LINE");
+ ui_out_table_header (uiout, (sizeof (CORE_ADDR) * 2 + 2)
+ , ui_left, "address", "ADDRESS");
+ ui_out_table_body (uiout);
+
+ for (i = 0; i < linetable->nitems; ++i)
+ {
+ struct linetable_entry *item;
+ struct cleanup *row_cleanup;
+
+ item = &linetable->item [i];
+
+ row_cleanup
+ = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
+
+ ui_out_field_int (uiout, "index", i);
+ ui_out_field_int (uiout, "line", item->line);
+ ui_out_field_string (uiout, "address", core_addr_to_string (item->pc));
+
+ ui_out_text (uiout, "\n");
+ do_cleanups (row_cleanup);
+ }
+
+ do_cleanups (table_cleanup);
+}
+
+
/* Do early runtime initializations. */
void
@@ -982,6 +1060,12 @@ linetables --- just the symbol table structures themselves.\n\
With an argument REGEXP, list the symbol tables with matching names."),
&maintenanceinfolist);
+ add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
+List line tables contents for specified symtab.\n\
+Given the filename of a symtab, list the contents of the\n\
+associated line table."),
+ &maintenanceinfolist);
+
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
_("\
Check consistency of currently expanded symtabs."),
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 046f112..e2015a8 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-02-06 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.base/maint.exp: New tests for 'maint info line-table'.
+
2016-02-04 Yao Qi <yao.qi@linaro.org>
* gdb.base/foll-exec-mode.c: Include limits.h.
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index 79924a7..93236ce 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -471,6 +471,22 @@ gdb_test "maint" \
"\"maintenance\" must be followed by the name of a maintenance command\\.\r\nList.*unambiguous\\..*" \
"maint w/o args"
+gdb_test "maint info line-table" \
+ "Line table for `\[^\n\r\]+${srcfile}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table w/o a file name"
+
+gdb_test "maint info line-table ${srcfile}" \
+ "Line table for `\[^\n\r\]+${srcfile}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of current symtab"
+
+gdb_test "maint info line-table ${srcfile2}" \
+ "Line table for `\[^\n\r\]+${srcfile2}':.*INDEX.*LINE.*ADDRESS.*" \
+ "maint info line-table with filename of symtab that is not current"
+
+gdb_test "maint info line-table xxx.c" \
+ "No matching symbol table found for `.*'." \
+ "maint info line-table with invalid filename"
+
set timeout $oldtimeout
#============test help on maint commands
--
2.5.1
More information about the Gdb-patches
mailing list