From f2403c39342b723a18a2bea5ed209c8c96203d2b Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Thu, 21 Jan 2016 11:03:32 +0100 Subject: [PATCH] gdb: New maint info line-table command. 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. (maintenance_print_one_line_table): 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 | 7 ++++ gdb/NEWS | 3 ++ gdb/doc/ChangeLog | 5 +++ gdb/doc/gdb.texinfo | 9 ++++ gdb/symmisc.c | 90 ++++++++++++++++++++++++++++++++++++++++ gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.base/maint.exp | 20 +++++++++ 7 files changed, 138 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index febe960..6eeb1e2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2016-03-11 Andrew Burgess + + * symmisc.c (maintenance_info_line_tables): New function. + (maintenance_print_one_line_table): New function. + (_initialize_symmisc): Register 'maint info line-table' command. + * NEWS: Mention new command. + 2016-03-11 Marcin Kościelnicki * s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function. diff --git a/gdb/NEWS b/gdb/NEWS index 55b56b0..928f70c 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -31,6 +31,9 @@ skip -rfunction regular-expression glob-style file names and regular expressions for function names. Additionally, a file spec and a function spec may now be combined. +maint info line-table REGEXP + Display the contents of GDB's internal line table data struture. + *** Changes in GDB 7.11 * GDB now supports debugging kernel-based threads on FreeBSD. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 3a98647..3d49085 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2016-03-11 Andrew Burgess + + * gdb.texinfo (Symbols): Document new 'maint info line-table' + command. + 2016-03-10 Simon Marchi * gdb.texinfo (Convenience Functions): Document $_as_string. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 0b249f4..bf7df35 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -17175,6 +17175,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 @r{[} @var{regexp} @r{]} + +List the @code{struct linetable} from all @code{struct symtab} +instances whose name matches @var{regexp}. If @var{regexp} is not +given, list the @code{struct linetable} from all @code{struct symtab}. + @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..88daf09 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -949,6 +949,90 @@ block_depth (struct block *block) } +/* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a + single line table. */ + +static int +maintenance_print_one_line_table (struct symtab *symtab, void *data) +{ + struct linetable *linetable; + struct objfile *objfile; + + objfile = symtab->compunit_symtab->objfile; + printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"), + objfile_name (objfile), + host_address_to_string (objfile)); + printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"), + host_address_to_string (symtab->compunit_symtab)); + printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"), + symtab_to_fullname (symtab), + host_address_to_string (symtab)); + linetable = SYMTAB_LINETABLE (symtab); + printf_filtered (_("linetable: ((struct linetable *) %s):\n"), + host_address_to_string (linetable)); + + if (linetable == NULL) + printf_filtered (_("No line table.\n")); + else if (linetable->nitems <= 0) + printf_filtered (_("Line table has no lines.\n")); + else + { + int i; + + /* Leave space for 6 digits of index and line number. After that the + tables will just not format as well. */ + printf_filtered (_("%-6s %6s %s\n"), + _("INDEX"), _("LINE"), _("ADDRESS")); + + for (i = 0; i < linetable->nitems; ++i) + { + struct linetable_entry *item; + struct cleanup *row_cleanup; + + item = &linetable->item [i]; + printf_filtered (_("%-6d %6d %s\n"), i, item->line, + core_addr_to_string (item->pc)); + } + } + + return 0; +} + +/* Implement the 'maint info line-table' command. */ + +static void +maintenance_info_line_tables (char *regexp, int from_tty) +{ + struct program_space *pspace; + struct objfile *objfile; + + dont_repeat (); + + if (regexp != NULL) + re_comp (regexp); + + ALL_PSPACES (pspace) + ALL_PSPACE_OBJFILES (pspace, objfile) + { + struct compunit_symtab *cust; + struct symtab *symtab; + + ALL_OBJFILE_COMPUNITS (objfile, cust) + { + ALL_COMPUNIT_FILETABS (cust, symtab) + { + QUIT; + + if (regexp == NULL + || re_exec (symtab_to_filename_for_display (symtab))) + maintenance_print_one_line_table (symtab, NULL); + } + } + } +} + + + /* Do early runtime initializations. */ void @@ -982,6 +1066,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 the contents of all line tables, from all symbol tables.\n\ +With an argument REGEXP, list just the line tables for the symbol\n\ +tables with matching names."), + &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 411081c..625359f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-03-11 Andrew Burgess + + * gdb.base/maint.exp: New tests for 'maint info line-table'. + 2016-03-10 Simon Marchi * gdb.python/py-as-string.exp: New file. diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index 79924a7..f926c8b 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -471,6 +471,26 @@ 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" \ + "symtab: \[^\n\r\]+${srcfile}.*\\(\\(struct symtab \\*\\) $hex\\)\r\nlinetable: \\(\\(struct linetable \\*\\) $hex\\):\r\nINDEX.*LINE.*ADDRESS.*" \ + "maint info line-table w/o a file name" + +gdb_test "maint info line-table ${srcfile}" \ + "symtab: \[^\n\r\]+${srcfile}.*INDEX.*LINE.*ADDRESS.*" \ + "maint info line-table with filename of current symtab" + +gdb_test_no_output "maint info line-table ${srcfile2}" \ + "maint info line-table with filename of symtab that is not currently expanded" + +gdb_test_no_output "maint expand-symtabs" + +gdb_test "maint info line-table ${srcfile2}" \ + "symtab: \[^\n\r\]+${srcfile2}.*INDEX.*LINE.*ADDRESS.*" \ + "maint info line-table with filename of symtab that is not current" + +gdb_test_no_output "maint info line-table xxx.c" \ + "maint info line-table with invalid filename" + set timeout $oldtimeout #============test help on maint commands -- 2.7.4