* NEWS: Mention new maintenance commands check-symtabs, and

expand-symtabs, and renamed check-psymtabs.
	* psymtab.c (maintenance_check_psymtabs): Renamed from
	maintenance_check_symtabs.  Only process already-expanded symbol
	tables.
	(_initialize_psymtab): Update.
	* symmisc.c (maintenance_check_symtabs): New function.
	(maintenance_expand_name_matcher): New function
	(maintenance_expand_file_matcher): New function
	(maintenance_expand_symtabs): New function.
	(_initialize_symmisc): Add "mt check-symtabs" and "mt expand-symtabs"
	commands.

	doc/
	* gdb.texinfo (Maintenance Commands): Update doc for
	"maint check-psymtabs".  Add doc for "maint check-symtabs",
	"maint expand-symtabs".

	testsuite/
	* gdb.base/maint.exp: Update test for "maint check-psymtabs".
	Add tests for "maint check-symtabs", "maint expand-symtabs".
This commit is contained in:
Doug Evans
2013-05-17 18:09:06 +00:00
parent 8d324e8329
commit 7d0c9981dc
8 changed files with 232 additions and 27 deletions

View File

@ -1,3 +1,18 @@
2013-05-17 Doug Evans <dje@google.com>
* NEWS: Mention new maintenance commands check-symtabs, and
expand-symtabs, and renamed check-psymtabs.
* psymtab.c (maintenance_check_psymtabs): Renamed from
maintenance_check_symtabs. Only process already-expanded symbol
tables.
(_initialize_psymtab): Update.
* symmisc.c (maintenance_check_symtabs): New function.
(maintenance_expand_name_matcher): New function
(maintenance_expand_file_matcher): New function
(maintenance_expand_symtabs): New function.
(_initialize_symmisc): Add "mt check-symtabs" and "mt expand-symtabs"
commands.
2013-05-17 Tom Tromey <tromey@redhat.com> 2013-05-17 Tom Tromey <tromey@redhat.com>
* python/py-inferior.c (infpy_read_memory): Don't call * python/py-inferior.c (infpy_read_memory): Don't call

View File

@ -15,6 +15,12 @@ Nios II GNU/Linux nios2*-*-linux
* New commands: * New commands:
catch rethrow catch rethrow
Like "catch throw", but catches a re-thrown exception. Like "catch throw", but catches a re-thrown exception.
maint check-psymtabs
Renamed from old "maint check-symtabs".
maint check-symtabs
Perform consistency checks on symtabs.
maint expand-symtabs
Expand symtabs matching an optional regexp.
show configuration show configuration
Display the details of GDB configure-time options. Display the details of GDB configure-time options.

View File

@ -1,3 +1,9 @@
2013-05-17 Doug Evans <dje@google.com>
* gdb.texinfo (Maintenance Commands): Update doc for
"maint check-psymtabs". Add doc for "maint check-symtabs",
"maint expand-symtabs".
2013-05-15 Markus Metzger <markus.t.metzger@intel.com> 2013-05-15 Markus Metzger <markus.t.metzger@intel.com>
* gdb.texinfo (Process Record and Replay): Document the * gdb.texinfo (Process Record and Replay): Document the

View File

@ -36356,9 +36356,20 @@ only if non-stop mode is active (@pxref{Non-Stop Mode}) and the target
architecture supports displaced stepping. architecture supports displaced stepping.
@end table @end table
@kindex maint check-psymtabs
@item maint check-psymtabs
Check the consistency of currently expanded psymtabs versus symtabs.
Use this to check, for example, whether a symbol is in one but not the other.
@kindex maint check-symtabs @kindex maint check-symtabs
@item maint check-symtabs @item maint check-symtabs
Check the consistency of psymtabs and symtabs. Check the consistency of currently expanded symtabs.
@kindex maint expand-symtabs
@item maint expand-symtabs [@var{regexp}]
Expand symbol tables.
If @var{regexp} is specified, only expand symbol tables for file
names matching @var{regexp}.
@kindex maint cplus first_component @kindex maint cplus first_component
@item maint cplus first_component @var{name} @item maint cplus first_component @var{name}

View File

@ -2007,10 +2007,10 @@ maintenance_info_psymtabs (char *regexp, int from_tty)
} }
} }
/* Check consistency of psymtabs and symtabs. */ /* Check consistency of currently expanded psymtabs vs symtabs. */
static void static void
maintenance_check_symtabs (char *ignore, int from_tty) maintenance_check_psymtabs (char *ignore, int from_tty)
{ {
struct symbol *sym; struct symbol *sym;
struct partial_symbol **psym; struct partial_symbol **psym;
@ -2025,7 +2025,25 @@ maintenance_check_symtabs (char *ignore, int from_tty)
{ {
struct gdbarch *gdbarch = get_objfile_arch (objfile); struct gdbarch *gdbarch = get_objfile_arch (objfile);
s = psymtab_to_symtab (objfile, ps); /* We don't call psymtab_to_symtab here because that may cause symtab
expansion. When debugging a problem it helps if checkers leave
things unchanged. */
s = ps->symtab;
/* First do some checks that don't require the associated symtab. */
if (ps->texthigh < ps->textlow)
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers bad range ");
fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
printf_filtered ("\n");
continue;
}
/* Now do checks requiring the associated symtab. */
if (s == NULL) if (s == NULL)
continue; continue;
bv = BLOCKVECTOR (s); bv = BLOCKVECTOR (s);
@ -2063,20 +2081,8 @@ maintenance_check_symtabs (char *ignore, int from_tty)
} }
psym++; psym++;
} }
if (ps->texthigh < ps->textlow) if (ps->texthigh != 0
{ && (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b)))
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers bad range ");
fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
printf_filtered (" - ");
fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
printf_filtered ("\n");
continue;
}
if (ps->texthigh == 0)
continue;
if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
{ {
printf_filtered ("Psymtab "); printf_filtered ("Psymtab ");
puts_filtered (ps->filename); puts_filtered (ps->filename);
@ -2140,7 +2146,8 @@ This does not include information about individual partial symbols,\n\
just the symbol table structures themselves."), just the symbol table structures themselves."),
&maintenanceinfolist); &maintenanceinfolist);
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs, add_cmd ("check-psymtabs", class_maintenance, maintenance_check_psymtabs,
_("Check consistency of psymtabs and symtabs."), _("\
Check consistency of currently expanded psymtabs versus symtabs."),
&maintenancelist); &maintenancelist);
} }

View File

@ -771,6 +771,134 @@ maintenance_info_symtabs (char *regexp, int from_tty)
printf_filtered ("}\n"); printf_filtered ("}\n");
} }
} }
/* Check consistency of symtabs.
An example of what this checks for is NULL blockvectors.
They can happen if there's a bug during debug info reading.
GDB assumes they are always non-NULL.
Note: This does not check for psymtab vs symtab consistency.
Use "maint check-psymtabs" for that. */
static void
maintenance_check_symtabs (char *ignore, int from_tty)
{
struct program_space *pspace;
struct objfile *objfile;
ALL_PSPACES (pspace)
ALL_PSPACE_OBJFILES (pspace, objfile)
{
struct symtab *symtab;
/* We don't want to print anything for this objfile until we
actually find something worth printing. */
int printed_objfile_start = 0;
ALL_OBJFILE_SYMTABS (objfile, symtab)
{
int found_something = 0;
QUIT;
if (symtab->blockvector == NULL)
found_something = 1;
/* Add more checks here. */
if (found_something)
{
if (! printed_objfile_start)
{
printf_filtered ("{ objfile %s ", objfile->name);
wrap_here (" ");
printf_filtered ("((struct objfile *) %s)\n",
host_address_to_string (objfile));
printed_objfile_start = 1;
}
printf_filtered (" { symtab %s\n",
symtab_to_filename_for_display (symtab));
if (symtab->blockvector == NULL)
printf_filtered (" NULL blockvector\n");
printf_filtered (" }\n");
}
}
if (printed_objfile_start)
printf_filtered ("}\n");
}
}
/* Helper function for maintenance_expand_symtabs.
This is the name_matcher function for expand_symtabs_matching. */
static int
maintenance_expand_name_matcher (const char *symname, void *data)
{
/* Since we're not searching on symbols, just return TRUE. */
return 1;
}
/* Helper function for maintenance_expand_symtabs.
This is the file_matcher function for expand_symtabs_matching. */
static int
maintenance_expand_file_matcher (const char *filename, void *data,
int basenames)
{
const char *regexp = data;
QUIT;
/* KISS: Only apply the regexp to the complete file name. */
if (basenames)
return 0;
if (regexp == NULL || re_exec (filename))
return 1;
return 0;
}
/* Expand all symbol tables whose name matches an optional regexp. */
static void
maintenance_expand_symtabs (char *args, int from_tty)
{
struct program_space *pspace;
struct objfile *objfile;
struct cleanup *cleanups;
char **argv;
char *regexp = NULL;
/* We use buildargv here so that we handle spaces in the regexp
in a way that allows adding more arguments later. */
argv = gdb_buildargv (args);
cleanups = make_cleanup_freeargv (argv);
if (argv != NULL)
{
if (argv[0] != NULL)
{
regexp = argv[0];
if (argv[1] != NULL)
error (_("Extra arguments after regexp."));
}
}
if (regexp)
re_comp (regexp);
ALL_PSPACES (pspace)
ALL_PSPACE_OBJFILES (pspace, objfile)
{
if (objfile->sf)
{
objfile->sf->qf->expand_symtabs_matching
(objfile, maintenance_expand_file_matcher,
maintenance_expand_name_matcher, ALL_DOMAIN, regexp);
}
}
}
/* Return the nexting depth of a block within other blocks in its symtab. */ /* Return the nexting depth of a block within other blocks in its symtab. */
@ -819,4 +947,14 @@ This does not include information about individual symbols, blocks, or\n\
linetables --- just the symbol table structures themselves.\n\ linetables --- just the symbol table structures themselves.\n\
With an argument REGEXP, list the symbol tables whose names that match that."), With an argument REGEXP, list the symbol tables whose names that match that."),
&maintenanceinfolist); &maintenanceinfolist);
add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
_("\
Check consistency of currently expanded symtabs."),
&maintenancelist);
add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
_("Expand symbol tables.\n\
With an argument REGEXP, only expand the symbol tables with matching names."),
&maintenancelist);
} }

View File

@ -1,5 +1,8 @@
2013-05-17 Doug Evans <dje@google.com> 2013-05-17 Doug Evans <dje@google.com>
* gdb.base/maint.exp: Update test for "maint check-psymtabs".
Add tests for "maint check-symtabs", "maint expand-symtabs".
* gdb.base/maint.exp: Remove testing of individual maint command * gdb.base/maint.exp: Remove testing of individual maint command
help output. help output.

View File

@ -20,7 +20,9 @@
# source file used is break.c # source file used is break.c
#maintenance check-symtabs -- Check consistency of psymtabs and symtabs #maintenance check-psymtabs -- Check consistency of psymtabs vs symtabs
#maintenance check-symtabs -- Check consistency of symtabs
#maintenance expand-symtabs -- Expand symtabs matching a file regexp
#maintenance set -- Set GDB internal variables used by the GDB maintainer #maintenance set -- Set GDB internal variables used by the GDB maintainer
#maintenance show -- Show GDB internal variables used by the GDB maintainer #maintenance show -- Show GDB internal variables used by the GDB maintainer
#maintenance demangle -- Demangle a C++ mangled name #maintenance demangle -- Demangle a C++ mangled name
@ -82,6 +84,18 @@ gdb_file_cmd ${binfile}
# program wasn't running. # program wasn't running.
gdb_test "maint print registers" "Name.*Nr.*Rel.*Offset.*Size.*Type.*" gdb_test "maint print registers" "Name.*Nr.*Rel.*Offset.*Size.*Type.*"
# Test "mt expand-symtabs" here as it's easier to verify before we
# run the program.
gdb_test_no_output "mt set per on" "mt set per on for expand-symtabs"
gdb_test_multiple "mt expand-symtabs $subdir/break\[.\]c$" \
"mt expand-symtabs" {
-re "#primary symtabs: 1 \\(\[+\]1\\),.*$gdb_prompt $" {
# This should expand exactly one (primary) symtab.
pass "mt expand-symtabs"
}
}
gdb_test "mt set per off" ".*" "mt set per off for expand-symtabs"
# Tests that can or should be done with a running program # Tests that can or should be done with a running program
gdb_load ${binfile} gdb_load ${binfile}
@ -110,20 +124,25 @@ gdb_test_multiple "maint info sections .gdb_index" "check for .gdb_index" {
# guo: on linux this command output is huge. for some reason splitting up # guo: on linux this command output is huge. for some reason splitting up
# the regexp checks works. # the regexp checks works.
# #
send_gdb "maint check-symtabs\n" send_gdb "maint check-psymtabs\n"
gdb_expect { gdb_expect {
-re "^maint check-symtabs" { -re "^maint check-psymtabs" {
gdb_expect { gdb_expect {
-re "$gdb_prompt $" { -re "$gdb_prompt $" {
pass "maint check-symtabs" pass "maint check-psymtabs"
} }
timeout { fail "(timeout) maint check-symtabs" } timeout { fail "(timeout) maint check-psymtabs" }
} }
} }
-re ".*$gdb_prompt $" { fail "maint check-symtabs" } -re ".*$gdb_prompt $" { fail "maint check-psymtabs" }
timeout { fail "(timeout) maint check-symtabs" } timeout { fail "(timeout) maint check-psymtabs" }
} }
# This command does not produce any output unless there is some problem
# with the symtabs, so that branch will really never be covered in the
# tests here!!
gdb_test_no_output "maint check-symtabs"
gdb_test_no_output "maint set per-command on" gdb_test_no_output "maint set per-command on"
gdb_test "maint set per-command off" \ gdb_test "maint set per-command off" \