X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmaint.c;h=2fa6add384675611a7e3dac3f0cb6f8cb2ea97c0;hb=19db3e69f3d107ea02b97335daf429a660e6cf97;hp=5f3338ef1653c11ab0e5c1169157a9af31f4c3f1;hpb=01fe12f6fb039ef2841440b214d9fb905767a14d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/maint.c b/gdb/maint.c index 5f3338ef16..2fa6add384 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -1,7 +1,6 @@ /* Support for GDB maintenance commands. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, - 2003, 2004, 2007 Free Software Foundation, Inc. + Copyright (C) 1992-2014 Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support. @@ -22,11 +21,15 @@ #include "defs.h" +#include "arch-utils.h" #include #include +#include +#include #include "command.h" #include "gdbcmd.h" #include "symtab.h" +#include "block.h" #include "gdbtypes.h" #include "demangle.h" #include "gdbcore.h" @@ -35,8 +38,14 @@ #include "symfile.h" #include "objfiles.h" #include "value.h" +#include "gdb_assert.h" +#include "top.h" +#include "timeval-utils.h" +#include "maint.h" #include "cli/cli-decode.h" +#include "cli/cli-utils.h" +#include "cli/cli-setshow.h" extern void _initialize_maint_cmds (void); @@ -72,24 +81,13 @@ show_watchdog (struct ui_file *file, int from_tty, fprintf_filtered (file, _("Watchdog timer is %s.\n"), value); } -/* - - LOCAL FUNCTION - - maintenance_command -- access the maintenance subcommands - - SYNOPSIS - - void maintenance_command (char *args, int from_tty) - - DESCRIPTION - - */ +/* Access the maintenance subcommands. */ static void maintenance_command (char *args, int from_tty) { - printf_unfiltered (_("\"maintenance\" must be followed by the name of a maintenance command.\n")); + printf_unfiltered (_("\"maintenance\" must be followed by " + "the name of a maintenance command.\n")); help_list (maintenancelist, "maintenance ", -1, gdb_stdout); } @@ -97,7 +95,7 @@ maintenance_command (char *args, int from_tty) static void maintenance_dump_me (char *args, int from_tty) { - if (query ("Should GDB dump core? ")) + if (query (_("Should GDB dump core? "))) { #ifdef __DJGPP__ /* SIGQUIT by default is ignored, so use SIGABRT instead. */ @@ -114,7 +112,7 @@ maintenance_dump_me (char *args, int from_tty) /* Stimulate the internal error mechanism that GDB uses when an internal problem is detected. Allows testing of the mechanism. Also useful when the user wants to drop a core file but not exit - GDB. */ + GDB. */ static void maintenance_internal_error (char *args, int from_tty) @@ -125,7 +123,7 @@ maintenance_internal_error (char *args, int from_tty) /* Stimulate the internal error mechanism that GDB uses when an internal problem is detected. Allows testing of the mechanism. Also useful when the user wants to drop a core file but not exit - GDB. */ + GDB. */ static void maintenance_internal_warning (char *args, int from_tty) @@ -139,7 +137,7 @@ maintenance_internal_warning (char *args, int from_tty) debuggee's process space, and have gdb fetch and demangle that string. If we have a char* pointer "ptr" that points to a string, we might want to be able to given just the name and have GDB - demangle and print what it points to, etc. (FIXME) */ + demangle and print what it points to, etc. (FIXME) */ static void maintenance_demangle (char *args, int from_tty) @@ -148,7 +146,8 @@ maintenance_demangle (char *args, int from_tty) if (args == NULL || *args == '\0') { - printf_unfiltered (_("\"maintenance demangle\" takes an argument to demangle.\n")); + printf_unfiltered (_("\"maintenance demangle\" takes " + "an argument to demangle.\n")); } else { @@ -169,23 +168,19 @@ maintenance_demangle (char *args, int from_tty) static void maintenance_time_display (char *args, int from_tty) { - extern int display_time; - if (args == NULL || *args == '\0') printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n")); else - display_time = strtol (args, NULL, 10); + set_per_command_time (strtol (args, NULL, 10)); } static void maintenance_space_display (char *args, int from_tty) { - extern int display_space; - if (args == NULL || *args == '\0') printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n"); else - display_space = strtol (args, NULL, 10); + set_per_command_space (strtol (args, NULL, 10)); } /* The "maintenance info" command is defined as a prefix, with @@ -195,7 +190,8 @@ maintenance_space_display (char *args, int from_tty) static void maintenance_info_command (char *arg, int from_tty) { - printf_unfiltered (_("\"maintenance info\" must be followed by the name of an info command.\n")); + printf_unfiltered (_("\"maintenance info\" must be followed " + "by the name of an info command.\n")); help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout); } @@ -209,12 +205,12 @@ match_substring (const char *string, const char *substr) while ((tok = strstr (string, substr)) != NULL) { - /* Got a partial match. Is it a whole word? */ + /* Got a partial match. Is it a whole word? */ if (tok == string || tok[-1] == ' ' || tok[-1] == '\t') { - /* Token is delimited at the front... */ + /* Token is delimited at the front... */ if (tok[substr_len] == ' ' || tok[substr_len] == '\t' || tok[substr_len] == '\0') @@ -304,12 +300,10 @@ print_bfd_flags (flagword flags) static void maint_print_section_info (const char *name, flagword flags, CORE_ADDR addr, CORE_ADDR endaddr, - unsigned long filepos) + unsigned long filepos, int addr_size) { - /* FIXME-32x64: Need deprecated_print_address_numeric with field - width. */ - printf_filtered (" 0x%s", paddr (addr)); - printf_filtered ("->0x%s", paddr (endaddr)); + printf_filtered (" %s", hex_string_custom (addr, addr_size)); + printf_filtered ("->%s", hex_string_custom (endaddr, addr_size)); printf_filtered (" at %s", hex_string_custom ((unsigned long) filepos, 8)); printf_filtered (": %s", name); @@ -329,11 +323,15 @@ print_bfd_section_info (bfd *abfd, || match_substring ((char *) arg, name) || match_bfd_flags ((char *) arg, flags)) { + struct gdbarch *gdbarch = gdbarch_from_bfd (abfd); + int addr_size = gdbarch_addr_bit (gdbarch) / 8; CORE_ADDR addr, endaddr; addr = bfd_section_vma (abfd, asect); endaddr = addr + bfd_section_size (abfd, asect); - maint_print_section_info (name, flags, addr, endaddr, asect->filepos); + printf_filtered (" [%d] ", gdb_bfd_section_index (abfd, asect)); + maint_print_section_info (name, flags, addr, endaddr, + asect->filepos, addr_size); } } @@ -349,8 +347,14 @@ print_objfile_section_info (bfd *abfd, || match_substring (string, name) || match_bfd_flags (string, flags)) { - maint_print_section_info (name, flags, asect->addr, asect->endaddr, - asect->the_bfd_section->filepos); + struct gdbarch *gdbarch = gdbarch_from_bfd (abfd); + int addr_size = gdbarch_addr_bit (gdbarch) / 8; + + maint_print_section_info (name, flags, + obj_section_addr (asect), + obj_section_endaddr (asect), + asect->the_bfd_section->filepos, + addr_size); } } @@ -399,7 +403,7 @@ maintenance_info_sections (char *arg, int from_tty) } } -void +static void maintenance_print_statistics (char *args, int from_tty) { print_objfile_statistics (); @@ -409,15 +413,20 @@ maintenance_print_statistics (char *args, int from_tty) static void maintenance_print_architecture (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + if (args == NULL) - gdbarch_dump (current_gdbarch, gdb_stdout); + gdbarch_dump (gdbarch, gdb_stdout); else { + struct cleanup *cleanups; struct ui_file *file = gdb_fopen (args, "w"); + if (file == NULL) perror_with_name (_("maintenance print architecture")); - gdbarch_dump (current_gdbarch, file); - ui_file_delete (file); + cleanups = make_cleanup_ui_file_delete (file); + gdbarch_dump (gdbarch, file); + do_cleanups (cleanups); } } @@ -428,23 +437,23 @@ maintenance_print_architecture (char *args, int from_tty) static void maintenance_print_command (char *arg, int from_tty) { - printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n")); + printf_unfiltered (_("\"maintenance print\" must be followed " + "by the name of a print command.\n")); help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout); } /* The "maintenance translate-address" command converts a section and address to a symbol. This can be called in two ways: maintenance translate-address - or maintenance translate-address - */ + or maintenance translate-address . */ static void maintenance_translate_address (char *arg, int from_tty) { CORE_ADDR address; - asection *sect; + struct obj_section *sect; char *p; - struct minimal_symbol *sym; + struct bound_minimal_symbol sym; struct objfile *objfile; if (arg == NULL || *arg == 0) @@ -454,23 +463,21 @@ maintenance_translate_address (char *arg, int from_tty) p = arg; if (!isdigit (*p)) - { /* See if we have a valid section name */ - while (*p && !isspace (*p)) /* Find end of section name */ + { /* See if we have a valid section name. */ + while (*p && !isspace (*p)) /* Find end of section name. */ p++; - if (*p == '\000') /* End of command? */ + if (*p == '\000') /* End of command? */ error (_("Need to specify and
")); *p++ = '\000'; - while (isspace (*p)) - p++; /* Skip whitespace */ + p = skip_spaces (p); - ALL_OBJFILES (objfile) + ALL_OBJSECTIONS (objfile, sect) { - sect = bfd_get_section_by_name (objfile->obfd, arg); - if (sect != NULL) + if (strcmp (sect->the_bfd_section->name, arg) == 0) break; } - if (!sect) + if (!objfile) error (_("Unknown section %s."), arg); } @@ -481,14 +488,40 @@ maintenance_translate_address (char *arg, int from_tty) else sym = lookup_minimal_symbol_by_pc (address); - if (sym) - printf_filtered ("%s+%s\n", - SYMBOL_PRINT_NAME (sym), - paddr_u (address - SYMBOL_VALUE_ADDRESS (sym))); + if (sym.minsym) + { + const char *symbol_name = SYMBOL_PRINT_NAME (sym.minsym); + const char *symbol_offset + = pulongest (address - SYMBOL_VALUE_ADDRESS (sym.minsym)); + + sect = SYMBOL_OBJ_SECTION(sym.objfile, sym.minsym); + if (sect != NULL) + { + const char *section_name; + const char *obj_name; + + gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name); + section_name = sect->the_bfd_section->name; + + gdb_assert (sect->objfile && objfile_name (sect->objfile)); + obj_name = objfile_name (sect->objfile); + + if (MULTI_OBJFILE_P ()) + printf_filtered (_("%s + %s in section %s of %s\n"), + symbol_name, symbol_offset, + section_name, obj_name); + else + printf_filtered (_("%s + %s in section %s\n"), + symbol_name, symbol_offset, section_name); + } + else + printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset); + } else if (sect) - printf_filtered (_("no symbol at %s:0x%s\n"), sect->name, paddr (address)); + printf_filtered (_("no symbol at %s:%s\n"), + sect->the_bfd_section->name, hex_string (address)); else - printf_filtered (_("no symbol at 0x%s\n"), paddr (address)); + printf_filtered (_("no symbol at %s\n"), hex_string (address)); return; } @@ -496,15 +529,15 @@ maintenance_translate_address (char *arg, int from_tty) /* When a command is deprecated the user will be warned the first time the command is used. If possible, a replacement will be - offered. */ + offered. */ static void maintenance_deprecate (char *args, int from_tty) { if (args == NULL || *args == '\0') { - printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\ -the command you want to deprecate, and optionally the replacement command \n\ + printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\ +the command you want to deprecate, and optionally the replacement command\n\ enclosed in quotes.\n")); } @@ -526,7 +559,7 @@ the command you want to undeprecate.\n")); } -/* You really shouldn't be using this. It is just for the testsuite. +/* You really shouldn't be using this. It is just for the testsuite. Rather, you should use deprecate_cmd() when the command is created in _initialize_blah(). @@ -536,7 +569,6 @@ the command you want to undeprecate.\n")); static void maintenance_do_deprecate (char *text, int deprecate) { - struct cmd_list_element *alias = NULL; struct cmd_list_element *prefix_cmd = NULL; struct cmd_list_element *cmd = NULL; @@ -557,7 +589,7 @@ maintenance_do_deprecate (char *text, int deprecate) if (deprecate) { - /* look for a replacement command */ + /* Look for a replacement command. */ start_ptr = strchr (text, '\"'); if (start_ptr != NULL) { @@ -580,34 +612,46 @@ maintenance_do_deprecate (char *text, int deprecate) Note the MALLOCED_REPLACEMENT test. If the command's replacement string was allocated at compile time we don't want to free the - memory. */ + memory. */ if (alias) { - - if (alias->flags & MALLOCED_REPLACEMENT) + if (alias->malloced_replacement) xfree (alias->replacement); if (deprecate) - alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED); + { + alias->deprecated_warn_user = 1; + alias->cmd_deprecated = 1; + } else - alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED); + { + alias->deprecated_warn_user = 0; + alias->cmd_deprecated = 0; + } alias->replacement = replacement; - alias->flags |= MALLOCED_REPLACEMENT; + alias->malloced_replacement = 1; return; } else if (cmd) { - if (cmd->flags & MALLOCED_REPLACEMENT) + if (cmd->malloced_replacement) xfree (cmd->replacement); if (deprecate) - cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED); + { + cmd->deprecated_warn_user = 1; + cmd->cmd_deprecated = 1; + } else - cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED); + { + cmd->deprecated_warn_user = 0; + cmd->cmd_deprecated = 0; + } cmd->replacement = replacement; - cmd->flags |= MALLOCED_REPLACEMENT; + cmd->malloced_replacement = 1; return; } + xfree (replacement); } /* Maintenance set/show framework. */ @@ -618,7 +662,8 @@ struct cmd_list_element *maintenance_show_cmdlist; static void maintenance_set_cmd (char *args, int from_tty) { - printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n")); + printf_unfiltered (_("\"maintenance set\" must be followed " + "by the name of a set command.\n")); help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout); } @@ -660,7 +705,8 @@ mcleanup_wrapper (void) } static void -maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c) +maintenance_set_profile_cmd (char *args, int from_tty, + struct cmd_list_element *c) { if (maintenance_profile_p == profiling_state) return; @@ -687,22 +733,258 @@ maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element * else { extern void _mcleanup (void); + _mcleanup (); } } #else static void -maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c) +maintenance_set_profile_cmd (char *args, int from_tty, + struct cmd_list_element *c) { error (_("Profiling support is not available on this system.")); } #endif + +/* If nonzero, display time usage both at startup and for each command. */ + +static int per_command_time; + +/* If nonzero, display space usage both at startup and for each command. */ + +static int per_command_space; + +/* If nonzero, display basic symtab stats for each command. */ + +static int per_command_symtab; + +/* mt per-command commands. */ + +static struct cmd_list_element *per_command_setlist; +static struct cmd_list_element *per_command_showlist; + +/* Records a run time and space usage to be used as a base for + reporting elapsed time or change in space. */ + +struct cmd_stats +{ + /* Zero if the saved time is from the beginning of GDB execution. + One if from the beginning of an individual command execution. */ + int msg_type; + /* Track whether the stat was enabled at the start of the command + so that we can avoid printing anything if it gets turned on by + the current command. */ + int time_enabled : 1; + int space_enabled : 1; + int symtab_enabled : 1; + long start_cpu_time; + struct timeval start_wall_time; + long start_space; + /* Total number of symtabs (over all objfiles). */ + int start_nr_symtabs; + /* Of those, a count of just the primary ones. */ + int start_nr_primary_symtabs; + /* Total number of blocks. */ + int start_nr_blocks; +}; + +/* Set whether to display time statistics to NEW_VALUE + (non-zero means true). */ void -_initialize_maint_cmds (void) +set_per_command_time (int new_value) +{ + per_command_time = new_value; +} + +/* Set whether to display space statistics to NEW_VALUE + (non-zero means true). */ + +void +set_per_command_space (int new_value) +{ + per_command_space = new_value; +} + +/* Count the number of symtabs and blocks. */ + +static void +count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr, + int *nr_blocks_ptr) +{ + struct objfile *o; + struct symtab *s; + int nr_symtabs = 0; + int nr_primary_symtabs = 0; + int nr_blocks = 0; + + ALL_SYMTABS (o, s) + { + ++nr_symtabs; + if (s->primary) + { + ++nr_primary_symtabs; + nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); + } + } + + *nr_symtabs_ptr = nr_symtabs; + *nr_primary_symtabs_ptr = nr_primary_symtabs; + *nr_blocks_ptr = nr_blocks; +} + +/* As indicated by display_time and display_space, report GDB's elapsed time + and space usage from the base time and space provided in ARG, which + must be a pointer to a struct cmd_stat. This function is intended + to be called as a cleanup. */ + +static void +report_command_stats (void *arg) { - struct cmd_list_element *tmpcmd; + struct cmd_stats *start_stats = (struct cmd_stats *) arg; + int msg_type = start_stats->msg_type; + if (start_stats->time_enabled) + { + long cmd_time = get_run_time () - start_stats->start_cpu_time; + struct timeval now_wall_time, delta_wall_time, wait_time; + + gettimeofday (&now_wall_time, NULL); + timeval_sub (&delta_wall_time, + &now_wall_time, &start_stats->start_wall_time); + + /* Subtract time spend in prompt_for_continue from walltime. */ + wait_time = get_prompt_for_continue_wait_time (); + timeval_sub (&delta_wall_time, &delta_wall_time, &wait_time); + + printf_unfiltered (msg_type == 0 + ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n") + : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"), + cmd_time / 1000000, cmd_time % 1000000, + (long) delta_wall_time.tv_sec, + (long) delta_wall_time.tv_usec); + } + + if (start_stats->space_enabled) + { +#ifdef HAVE_SBRK + char *lim = (char *) sbrk (0); + + long space_now = lim - lim_at_start; + long space_diff = space_now - start_stats->start_space; + + printf_unfiltered (msg_type == 0 + ? _("Space used: %ld (%s%ld during startup)\n") + : _("Space used: %ld (%s%ld for this command)\n"), + space_now, + (space_diff >= 0 ? "+" : ""), + space_diff); +#endif + } + + if (start_stats->symtab_enabled) + { + int nr_symtabs, nr_primary_symtabs, nr_blocks; + + count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks); + printf_unfiltered (_("#symtabs: %d (+%d)," + " #primary symtabs: %d (+%d)," + " #blocks: %d (+%d)\n"), + nr_symtabs, + nr_symtabs - start_stats->start_nr_symtabs, + nr_primary_symtabs, + nr_primary_symtabs - start_stats->start_nr_primary_symtabs, + nr_blocks, + nr_blocks - start_stats->start_nr_blocks); + } +} + +/* Create a cleanup that reports time and space used since its creation. + MSG_TYPE is zero for gdb startup, otherwise it is one(1) to report + data for individual commands. */ + +struct cleanup * +make_command_stats_cleanup (int msg_type) +{ + struct cmd_stats *new_stat; + + /* Early exit if we're not reporting any stats. */ + if (!per_command_time + && !per_command_space + && !per_command_symtab) + return make_cleanup (null_cleanup, 0); + + new_stat = XCNEW (struct cmd_stats); + + new_stat->msg_type = msg_type; + + if (per_command_space) + { +#ifdef HAVE_SBRK + char *lim = (char *) sbrk (0); + new_stat->start_space = lim - lim_at_start; + new_stat->space_enabled = 1; +#endif + } + + if (per_command_time) + { + new_stat->start_cpu_time = get_run_time (); + gettimeofday (&new_stat->start_wall_time, NULL); + new_stat->time_enabled = 1; + } + + if (per_command_symtab) + { + int nr_symtabs, nr_primary_symtabs, nr_blocks; + + count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks); + new_stat->start_nr_symtabs = nr_symtabs; + new_stat->start_nr_primary_symtabs = nr_primary_symtabs; + new_stat->start_nr_blocks = nr_blocks; + new_stat->symtab_enabled = 1; + } + + /* Initalize timer to keep track of how long we waited for the user. */ + reset_prompt_for_continue_wait_time (); + + return make_cleanup_dtor (report_command_stats, new_stat, xfree); +} + +/* Handle unknown "mt set per-command" arguments. + In this case have "mt set per-command on|off" affect every setting. */ + +static void +set_per_command_cmd (char *args, int from_tty) +{ + struct cmd_list_element *list; + size_t length; + int val; + + val = parse_cli_boolean_value (args); + if (val < 0) + error (_("Bad value for 'mt set per-command no'.")); + + for (list = per_command_setlist; list != NULL; list = list->next) + if (list->var_type == var_boolean) + { + gdb_assert (list->type == set_cmd); + do_set_command (args, from_tty, list); + } +} + +/* Command "show per-command" displays summary of all the current + "show per-command " settings. */ + +static void +show_per_command_cmd (char *args, int from_tty) +{ + cmd_show_list (per_command_showlist, from_tty, ""); +} + +void +_initialize_maint_cmds (void) +{ add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\ Commands for use by GDB maintainers.\n\ Includes commands to dump specific internal GDB structures in\n\ @@ -776,12 +1058,56 @@ Call internal GDB demangler routine to demangle a C++ link name\n\ and prints the result."), &maintenancelist); + add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\ +Per-command statistics settings."), + &per_command_setlist, "set per-command ", + 1/*allow-unknown*/, &maintenance_set_cmdlist); + + add_prefix_cmd ("per-command", class_maintenance, show_per_command_cmd, _("\ +Show per-command statistics settings."), + &per_command_showlist, "show per-command ", + 0/*allow-unknown*/, &maintenance_show_cmdlist); + + add_setshow_boolean_cmd ("time", class_maintenance, + &per_command_time, _("\ +Set whether to display per-command execution time."), _("\ +Show whether to display per-command execution time."), + _("\ +If enabled, the execution time for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + add_setshow_boolean_cmd ("space", class_maintenance, + &per_command_space, _("\ +Set whether to display per-command space usage."), _("\ +Show whether to display per-command space usage."), + _("\ +If enabled, the space usage for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + add_setshow_boolean_cmd ("symtab", class_maintenance, + &per_command_symtab, _("\ +Set whether to display per-command symtab statistics."), _("\ +Show whether to display per-command symtab statistics."), + _("\ +If enabled, the basic symtab statistics for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + /* This is equivalent to "mt set per-command time on". + Kept because some people are used to typing "mt time 1". */ add_cmd ("time", class_maintenance, maintenance_time_display, _("\ Set the display of time usage.\n\ If nonzero, will cause the execution time for each command to be\n\ displayed, following the command's output."), &maintenancelist); + /* This is equivalent to "mt set per-command space on". + Kept because some people are used to typing "mt space 1". */ add_cmd ("space", class_maintenance, maintenance_space_display, _("\ Set the display of space usage.\n\ If nonzero, will cause the execution space for each command to be\n\ @@ -794,41 +1120,6 @@ For each node in a type chain, print the raw data for each member of\n\ the type structure, and the interpretation of the data."), &maintenanceprintlist); - add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\ -Print dump of current symbol definitions.\n\ -Entries in the full symbol table are dumped to file OUTFILE.\n\ -If a SOURCE file is specified, dump only that file's symbols."), - &maintenanceprintlist); - - add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\ -Print dump of current minimal symbol definitions.\n\ -Entries in the minimal symbol table are dumped to file OUTFILE.\n\ -If a SOURCE file is specified, dump only that file's minimal symbols."), - &maintenanceprintlist); - - add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\ -Print dump of current partial symbol definitions.\n\ -Entries in the partial symbol table are dumped to file OUTFILE.\n\ -If a SOURCE file is specified, dump only that file's partial symbols."), - &maintenanceprintlist); - - add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles, - _("Print dump of current object file definitions."), - &maintenanceprintlist); - - add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\ -List the full symbol tables for all object files.\n\ -This does not include information about individual symbols, blocks, or\n\ -linetables --- just the symbol table structures themselves.\n\ -With an argument REGEXP, list the symbol tables whose names that match that."), - &maintenanceinfolist); - - add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\ -List the partial symbol tables for all object files.\n\ -This does not include information about individual partial symbols,\n\ -just the symbol table structures themselves."), - &maintenanceinfolist); - add_cmd ("statistics", class_maintenance, maintenance_print_statistics, _("Print statistics about internal gdb state."), &maintenanceprintlist); @@ -839,24 +1130,21 @@ Print the internal architecture configuration.\n\ Takes an optional file parameter."), &maintenanceprintlist); - add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs, - _("Check consistency of psymtabs and symtabs."), - &maintenancelist); - - add_cmd ("translate-address", class_maintenance, maintenance_translate_address, + add_cmd ("translate-address", class_maintenance, + maintenance_translate_address, _("Translate a section name and address to a symbol."), &maintenancelist); add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\ Deprecate a command. Note that this is just in here so the \n\ -testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ +testsuite can check the command deprecator. You probably shouldn't use this,\n\ rather you should use the C function deprecate_cmd(). If you decide you \n\ want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\ replacement is optional."), &maintenancelist); add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\ Undeprecate a command. Note that this is just in here so the \n\ -testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ +testsuite can check the command deprecator. You probably shouldn't use this,\n\ If you decide you want to use it: maintenance undeprecate 'commandname'"), &maintenancelist);