1 /* Support for GDB maintenance commands.
3 Copyright (C) 1992-2017 Free Software Foundation, Inc.
5 Written by Fred Fish at Cygnus Support.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "arch-utils.h"
34 #include "expression.h" /* For language.h */
43 #include "cli/cli-decode.h"
44 #include "cli/cli-utils.h"
45 #include "cli/cli-setshow.h"
47 static void maintenance_command (char *, int);
49 static void maintenance_internal_error (char *args, int from_tty);
51 static void maintenance_demangle (char *, int);
53 static void maintenance_time_display (char *, int);
55 static void maintenance_space_display (char *, int);
57 static void maintenance_info_command (char *, int);
59 static void maintenance_info_sections (char *, int);
61 static void maintenance_print_command (char *, int);
63 static void maintenance_do_deprecate (char *, int);
65 /* Set this to the maximum number of seconds to wait instead of waiting forever
66 in target_wait(). If this timer times out, then it generates an error and
67 the command is aborted. This replaces most of the need for timeouts in the
68 GDB test suite, and makes it possible to distinguish between a hung target
69 and one with slow communications. */
73 show_watchdog (struct ui_file *file, int from_tty,
74 struct cmd_list_element *c, const char *value)
76 fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
79 /* Access the maintenance subcommands. */
82 maintenance_command (char *args, int from_tty)
84 printf_unfiltered (_("\"maintenance\" must be followed by "
85 "the name of a maintenance command.\n"));
86 help_list (maintenancelist, "maintenance ", all_commands, gdb_stdout);
91 maintenance_dump_me (char *args, int from_tty)
93 if (query (_("Should GDB dump core? ")))
96 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
97 signal (SIGABRT, SIG_DFL);
98 kill (getpid (), SIGABRT);
100 signal (SIGQUIT, SIG_DFL);
101 kill (getpid (), SIGQUIT);
107 /* Stimulate the internal error mechanism that GDB uses when an
108 internal problem is detected. Allows testing of the mechanism.
109 Also useful when the user wants to drop a core file but not exit
113 maintenance_internal_error (char *args, int from_tty)
115 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
118 /* Stimulate the internal error mechanism that GDB uses when an
119 internal problem is detected. Allows testing of the mechanism.
120 Also useful when the user wants to drop a core file but not exit
124 maintenance_internal_warning (char *args, int from_tty)
126 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
129 /* Stimulate the internal error mechanism that GDB uses when an
130 demangler problem is detected. Allows testing of the mechanism. */
133 maintenance_demangler_warning (char *args, int from_tty)
135 demangler_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
138 /* Old command to demangle a string. The command has been moved to "demangle".
139 It is kept for now because otherwise "mt demangle" gets interpreted as
140 "mt demangler-warning" which artificially creates an internal gdb error. */
143 maintenance_demangle (char *args, int from_tty)
145 printf_filtered (_("This command has been moved to \"demangle\".\n"));
149 maintenance_time_display (char *args, int from_tty)
151 if (args == NULL || *args == '\0')
152 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
154 set_per_command_time (strtol (args, NULL, 10));
158 maintenance_space_display (char *args, int from_tty)
160 if (args == NULL || *args == '\0')
161 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
163 set_per_command_space (strtol (args, NULL, 10));
166 /* The "maintenance info" command is defined as a prefix, with
167 allow_unknown 0. Therefore, its own definition is called only for
168 "maintenance info" with no args. */
171 maintenance_info_command (char *arg, int from_tty)
173 printf_unfiltered (_("\"maintenance info\" must be followed "
174 "by the name of an info command.\n"));
175 help_list (maintenanceinfolist, "maintenance info ", all_commands,
179 /* The "maintenance check" command is defined as a prefix, with
180 allow_unknown 0. Therefore, its own definition is called only for
181 "maintenance check" with no args. */
184 maintenance_check_command (char *arg, int from_tty)
186 printf_unfiltered (_("\"maintenance check\" must be followed "
187 "by the name of a check command.\n"));
188 help_list (maintenancechecklist, "maintenance check ", all_commands,
192 /* Mini tokenizing lexer for 'maint info sections' command. */
195 match_substring (const char *string, const char *substr)
197 int substr_len = strlen(substr);
200 while ((tok = strstr (string, substr)) != NULL)
202 /* Got a partial match. Is it a whole word? */
207 /* Token is delimited at the front... */
208 if (tok[substr_len] == ' '
209 || tok[substr_len] == '\t'
210 || tok[substr_len] == '\0')
212 /* Token is delimited at the rear. Got a whole-word match. */
216 /* Token didn't match as a whole word. Advance and try again. */
223 match_bfd_flags (const char *string, flagword flags)
225 if (flags & SEC_ALLOC)
226 if (match_substring (string, "ALLOC"))
228 if (flags & SEC_LOAD)
229 if (match_substring (string, "LOAD"))
231 if (flags & SEC_RELOC)
232 if (match_substring (string, "RELOC"))
234 if (flags & SEC_READONLY)
235 if (match_substring (string, "READONLY"))
237 if (flags & SEC_CODE)
238 if (match_substring (string, "CODE"))
240 if (flags & SEC_DATA)
241 if (match_substring (string, "DATA"))
244 if (match_substring (string, "ROM"))
246 if (flags & SEC_CONSTRUCTOR)
247 if (match_substring (string, "CONSTRUCTOR"))
249 if (flags & SEC_HAS_CONTENTS)
250 if (match_substring (string, "HAS_CONTENTS"))
252 if (flags & SEC_NEVER_LOAD)
253 if (match_substring (string, "NEVER_LOAD"))
255 if (flags & SEC_COFF_SHARED_LIBRARY)
256 if (match_substring (string, "COFF_SHARED_LIBRARY"))
258 if (flags & SEC_IS_COMMON)
259 if (match_substring (string, "IS_COMMON"))
266 print_bfd_flags (flagword flags)
268 if (flags & SEC_ALLOC)
269 printf_filtered (" ALLOC");
270 if (flags & SEC_LOAD)
271 printf_filtered (" LOAD");
272 if (flags & SEC_RELOC)
273 printf_filtered (" RELOC");
274 if (flags & SEC_READONLY)
275 printf_filtered (" READONLY");
276 if (flags & SEC_CODE)
277 printf_filtered (" CODE");
278 if (flags & SEC_DATA)
279 printf_filtered (" DATA");
281 printf_filtered (" ROM");
282 if (flags & SEC_CONSTRUCTOR)
283 printf_filtered (" CONSTRUCTOR");
284 if (flags & SEC_HAS_CONTENTS)
285 printf_filtered (" HAS_CONTENTS");
286 if (flags & SEC_NEVER_LOAD)
287 printf_filtered (" NEVER_LOAD");
288 if (flags & SEC_COFF_SHARED_LIBRARY)
289 printf_filtered (" COFF_SHARED_LIBRARY");
290 if (flags & SEC_IS_COMMON)
291 printf_filtered (" IS_COMMON");
295 maint_print_section_info (const char *name, flagword flags,
296 CORE_ADDR addr, CORE_ADDR endaddr,
297 unsigned long filepos, int addr_size)
299 printf_filtered (" %s", hex_string_custom (addr, addr_size));
300 printf_filtered ("->%s", hex_string_custom (endaddr, addr_size));
301 printf_filtered (" at %s",
302 hex_string_custom ((unsigned long) filepos, 8));
303 printf_filtered (": %s", name);
304 print_bfd_flags (flags);
305 printf_filtered ("\n");
309 print_bfd_section_info (bfd *abfd,
313 flagword flags = bfd_get_section_flags (abfd, asect);
314 const char *name = bfd_section_name (abfd, asect);
315 const char *arg = (const char *) datum;
317 if (arg == NULL || *arg == '\0'
318 || match_substring (arg, name)
319 || match_bfd_flags (arg, flags))
321 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
322 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
323 CORE_ADDR addr, endaddr;
325 addr = bfd_section_vma (abfd, asect);
326 endaddr = addr + bfd_section_size (abfd, asect);
327 printf_filtered (" [%d] ", gdb_bfd_section_index (abfd, asect));
328 maint_print_section_info (name, flags, addr, endaddr,
329 asect->filepos, addr_size);
334 print_objfile_section_info (bfd *abfd,
335 struct obj_section *asect,
338 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
339 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
341 if (string == NULL || *string == '\0'
342 || match_substring (string, name)
343 || match_bfd_flags (string, flags))
345 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
346 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
348 maint_print_section_info (name, flags,
349 obj_section_addr (asect),
350 obj_section_endaddr (asect),
351 asect->the_bfd_section->filepos,
357 maintenance_info_sections (char *arg, int from_tty)
361 printf_filtered (_("Exec file:\n"));
362 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
364 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
365 if (arg && *arg && match_substring (arg, "ALLOBJ"))
367 struct objfile *ofile;
368 struct obj_section *osect;
370 /* Only this function cares about the 'ALLOBJ' argument;
371 if 'ALLOBJ' is the only argument, discard it rather than
372 passing it down to print_objfile_section_info (which
373 wouldn't know how to handle it). */
374 if (strcmp (arg, "ALLOBJ") == 0)
379 printf_filtered (_(" Object file: %s\n"),
380 bfd_get_filename (ofile->obfd));
381 ALL_OBJFILE_OSECTIONS (ofile, osect)
383 print_objfile_section_info (ofile->obfd, osect, arg);
388 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
393 printf_filtered (_("Core file:\n"));
394 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
396 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
397 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
402 maintenance_print_statistics (char *args, int from_tty)
404 print_objfile_statistics ();
405 print_symbol_bcache_statistics ();
409 maintenance_print_architecture (char *args, int from_tty)
411 struct gdbarch *gdbarch = get_current_arch ();
414 gdbarch_dump (gdbarch, gdb_stdout);
419 if (!file.open (args, "w"))
420 perror_with_name (_("maintenance print architecture"));
421 gdbarch_dump (gdbarch, &file);
425 /* The "maintenance print" command is defined as a prefix, with
426 allow_unknown 0. Therefore, its own definition is called only for
427 "maintenance print" with no args. */
430 maintenance_print_command (char *arg, int from_tty)
432 printf_unfiltered (_("\"maintenance print\" must be followed "
433 "by the name of a print command.\n"));
434 help_list (maintenanceprintlist, "maintenance print ", all_commands,
438 /* The "maintenance translate-address" command converts a section and address
439 to a symbol. This can be called in two ways:
440 maintenance translate-address <secname> <addr>
441 or maintenance translate-address <addr>. */
444 maintenance_translate_address (char *arg, int from_tty)
447 struct obj_section *sect;
449 struct bound_minimal_symbol sym;
450 struct objfile *objfile;
452 if (arg == NULL || *arg == 0)
453 error (_("requires argument (address or section + address)"));
459 { /* See if we have a valid section name. */
460 while (*p && !isspace (*p)) /* Find end of section name. */
462 if (*p == '\000') /* End of command? */
463 error (_("Need to specify <section-name> and <address>"));
467 ALL_OBJSECTIONS (objfile, sect)
469 if (strcmp (sect->the_bfd_section->name, arg) == 0)
474 error (_("Unknown section %s."), arg);
477 address = parse_and_eval_address (p);
480 sym = lookup_minimal_symbol_by_pc_section (address, sect);
482 sym = lookup_minimal_symbol_by_pc (address);
486 const char *symbol_name = MSYMBOL_PRINT_NAME (sym.minsym);
487 const char *symbol_offset
488 = pulongest (address - BMSYMBOL_VALUE_ADDRESS (sym));
490 sect = MSYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
493 const char *section_name;
494 const char *obj_name;
496 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
497 section_name = sect->the_bfd_section->name;
499 gdb_assert (sect->objfile && objfile_name (sect->objfile));
500 obj_name = objfile_name (sect->objfile);
502 if (MULTI_OBJFILE_P ())
503 printf_filtered (_("%s + %s in section %s of %s\n"),
504 symbol_name, symbol_offset,
505 section_name, obj_name);
507 printf_filtered (_("%s + %s in section %s\n"),
508 symbol_name, symbol_offset, section_name);
511 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
514 printf_filtered (_("no symbol at %s:%s\n"),
515 sect->the_bfd_section->name, hex_string (address));
517 printf_filtered (_("no symbol at %s\n"), hex_string (address));
523 /* When a command is deprecated the user will be warned the first time
524 the command is used. If possible, a replacement will be
528 maintenance_deprecate (char *args, int from_tty)
530 if (args == NULL || *args == '\0')
532 printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\
533 the command you want to deprecate, and optionally the replacement command\n\
534 enclosed in quotes.\n"));
537 maintenance_do_deprecate (args, 1);
543 maintenance_undeprecate (char *args, int from_tty)
545 if (args == NULL || *args == '\0')
547 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
548 the command you want to undeprecate.\n"));
551 maintenance_do_deprecate (args, 0);
555 /* You really shouldn't be using this. It is just for the testsuite.
556 Rather, you should use deprecate_cmd() when the command is created
557 in _initialize_blah().
559 This function deprecates a command and optionally assigns it a
563 maintenance_do_deprecate (char *text, int deprecate)
565 struct cmd_list_element *alias = NULL;
566 struct cmd_list_element *prefix_cmd = NULL;
567 struct cmd_list_element *cmd = NULL;
569 char *start_ptr = NULL;
570 char *end_ptr = NULL;
572 char *replacement = NULL;
577 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
579 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
585 /* Look for a replacement command. */
586 start_ptr = strchr (text, '\"');
587 if (start_ptr != NULL)
590 end_ptr = strrchr (start_ptr, '\"');
593 len = end_ptr - start_ptr;
594 start_ptr[len] = '\0';
595 replacement = xstrdup (start_ptr);
600 if (!start_ptr || !end_ptr)
604 /* If they used an alias, we only want to deprecate the alias.
606 Note the MALLOCED_REPLACEMENT test. If the command's replacement
607 string was allocated at compile time we don't want to free the
611 if (alias->malloced_replacement)
612 xfree ((char *) alias->replacement);
616 alias->deprecated_warn_user = 1;
617 alias->cmd_deprecated = 1;
621 alias->deprecated_warn_user = 0;
622 alias->cmd_deprecated = 0;
624 alias->replacement = replacement;
625 alias->malloced_replacement = 1;
630 if (cmd->malloced_replacement)
631 xfree ((char *) cmd->replacement);
635 cmd->deprecated_warn_user = 1;
636 cmd->cmd_deprecated = 1;
640 cmd->deprecated_warn_user = 0;
641 cmd->cmd_deprecated = 0;
643 cmd->replacement = replacement;
644 cmd->malloced_replacement = 1;
650 /* Maintenance set/show framework. */
652 struct cmd_list_element *maintenance_set_cmdlist;
653 struct cmd_list_element *maintenance_show_cmdlist;
656 maintenance_set_cmd (char *args, int from_tty)
658 printf_unfiltered (_("\"maintenance set\" must be followed "
659 "by the name of a set command.\n"));
660 help_list (maintenance_set_cmdlist, "maintenance set ", all_commands,
665 maintenance_show_cmd (char *args, int from_tty)
667 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
670 /* Profiling support. */
672 static int maintenance_profile_p;
674 show_maintenance_profile_p (struct ui_file *file, int from_tty,
675 struct cmd_list_element *c, const char *value)
677 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
682 #define TEXTEND &_etext
683 #elif defined (HAVE_ETEXT)
685 #define TEXTEND &etext
688 #if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
690 static int profiling_state;
692 EXTERN_C void _mcleanup (void);
695 mcleanup_wrapper (void)
701 EXTERN_C void monstartup (unsigned long, unsigned long);
705 maintenance_set_profile_cmd (char *args, int from_tty,
706 struct cmd_list_element *c)
708 if (maintenance_profile_p == profiling_state)
711 profiling_state = maintenance_profile_p;
713 if (maintenance_profile_p)
715 static int profiling_initialized;
717 if (!profiling_initialized)
719 atexit (mcleanup_wrapper);
720 profiling_initialized = 1;
723 /* "main" is now always the first function in the text segment, so use
724 its address for monstartup. */
725 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
729 extern void _mcleanup (void);
736 maintenance_set_profile_cmd (char *args, int from_tty,
737 struct cmd_list_element *c)
739 error (_("Profiling support is not available on this system."));
743 /* If nonzero, display time usage both at startup and for each command. */
745 static int per_command_time;
747 /* If nonzero, display space usage both at startup and for each command. */
749 static int per_command_space;
751 /* If nonzero, display basic symtab stats for each command. */
753 static int per_command_symtab;
755 /* mt per-command commands. */
757 static struct cmd_list_element *per_command_setlist;
758 static struct cmd_list_element *per_command_showlist;
760 /* Set whether to display time statistics to NEW_VALUE
761 (non-zero means true). */
764 set_per_command_time (int new_value)
766 per_command_time = new_value;
769 /* Set whether to display space statistics to NEW_VALUE
770 (non-zero means true). */
773 set_per_command_space (int new_value)
775 per_command_space = new_value;
778 /* Count the number of symtabs and blocks. */
781 count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_compunit_symtabs_ptr,
785 struct compunit_symtab *cu;
788 int nr_compunit_symtabs = 0;
791 /* When collecting statistics during startup, this is called before
792 pretty much anything in gdb has been initialized, and thus
793 current_program_space may be NULL. */
794 if (current_program_space != NULL)
796 ALL_COMPUNITS (o, cu)
798 ++nr_compunit_symtabs;
799 nr_blocks += BLOCKVECTOR_NBLOCKS (COMPUNIT_BLOCKVECTOR (cu));
800 ALL_COMPUNIT_FILETABS (cu, s)
805 *nr_symtabs_ptr = nr_symtabs;
806 *nr_compunit_symtabs_ptr = nr_compunit_symtabs;
807 *nr_blocks_ptr = nr_blocks;
810 /* As indicated by display_time and display_space, report GDB's
811 elapsed time and space usage from the base time and space recorded
814 scoped_command_stats::~scoped_command_stats ()
816 /* Early exit if we're not reporting any stats. It can be expensive to
817 compute the pre-command values so don't collect them at all if we're
818 not reporting stats. Alas this doesn't work in the startup case because
819 we don't know yet whether we will be reporting the stats. For the
820 startup case collect the data anyway (it should be cheap at this point),
821 and leave it to the reporter to decide whether to print them. */
824 && !per_command_space
825 && !per_command_symtab)
828 if (m_time_enabled && per_command_time)
830 using namespace std::chrono;
832 run_time_clock::duration cmd_time
833 = run_time_clock::now () - m_start_cpu_time;
835 steady_clock::duration wall_time
836 = steady_clock::now () - m_start_wall_time;
837 /* Subtract time spend in prompt_for_continue from walltime. */
838 wall_time -= get_prompt_for_continue_wait_time ();
840 printf_unfiltered (!m_msg_type
841 ? _("Startup time: %.6f (cpu), %.6f (wall)\n")
842 : _("Command execution time: %.6f (cpu), %.6f (wall)\n"),
843 duration<double> (cmd_time).count (),
844 duration<double> (wall_time).count ());
847 if (m_space_enabled && per_command_space)
850 char *lim = (char *) sbrk (0);
852 long space_now = lim - lim_at_start;
853 long space_diff = space_now - m_start_space;
855 printf_unfiltered (!m_msg_type
856 ? _("Space used: %ld (%s%ld during startup)\n")
857 : _("Space used: %ld (%s%ld for this command)\n"),
859 (space_diff >= 0 ? "+" : ""),
864 if (m_symtab_enabled && per_command_symtab)
866 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
868 count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
869 printf_unfiltered (_("#symtabs: %d (+%d),"
870 " #compunits: %d (+%d),"
871 " #blocks: %d (+%d)\n"),
873 nr_symtabs - m_start_nr_symtabs,
876 - m_start_nr_compunit_symtabs),
878 nr_blocks - m_start_nr_blocks);
882 scoped_command_stats::scoped_command_stats (bool msg_type)
883 : m_msg_type (msg_type)
885 if (!m_msg_type || per_command_space)
888 char *lim = (char *) sbrk (0);
889 m_start_space = lim - lim_at_start;
896 if (msg_type == 0 || per_command_time)
898 using namespace std::chrono;
900 m_start_cpu_time = run_time_clock::now ();
901 m_start_wall_time = steady_clock::now ();
907 if (msg_type == 0 || per_command_symtab)
909 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
911 count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
912 m_start_nr_symtabs = nr_symtabs;
913 m_start_nr_compunit_symtabs = nr_compunit_symtabs;
914 m_start_nr_blocks = nr_blocks;
915 m_symtab_enabled = 1;
918 m_symtab_enabled = 0;
920 /* Initialize timer to keep track of how long we waited for the user. */
921 reset_prompt_for_continue_wait_time ();
924 /* Handle unknown "mt set per-command" arguments.
925 In this case have "mt set per-command on|off" affect every setting. */
928 set_per_command_cmd (char *args, int from_tty)
930 struct cmd_list_element *list;
933 val = parse_cli_boolean_value (args);
935 error (_("Bad value for 'mt set per-command no'."));
937 for (list = per_command_setlist; list != NULL; list = list->next)
938 if (list->var_type == var_boolean)
940 gdb_assert (list->type == set_cmd);
941 do_set_command (args, from_tty, list);
945 /* Command "show per-command" displays summary of all the current
946 "show per-command " settings. */
949 show_per_command_cmd (char *args, int from_tty)
951 cmd_show_list (per_command_showlist, from_tty, "");
955 /* The "maintenance selftest" command. */
958 maintenance_selftest (char *args, int from_tty)
960 selftests::run_tests (args);
964 maintenance_info_selftests (char *arg, int from_tty)
966 printf_filtered ("Registered selftests:\n");
967 selftests::for_each_selftest ([] (const std::string &name) {
968 printf_filtered (" - %s\n", name.c_str ());
974 _initialize_maint_cmds (void)
976 struct cmd_list_element *cmd;
978 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
979 Commands for use by GDB maintainers.\n\
980 Includes commands to dump specific internal GDB structures in\n\
981 a human readable form, to cause GDB to deliberately dump core, etc."),
982 &maintenancelist, "maintenance ", 0,
985 add_com_alias ("mt", "maintenance", class_maintenance, 1);
987 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
988 Commands for showing internal info about the program being debugged."),
989 &maintenanceinfolist, "maintenance info ", 0,
991 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
993 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
994 List the BFD sections of the exec and core files. \n\
995 Arguments may be any combination of:\n\
996 [one or more section names]\n\
997 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
998 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
999 Sections matching any argument will be listed (no argument\n\
1000 implies all sections). In addition, the special argument\n\
1002 lists all sections from all object files, including shared libraries."),
1003 &maintenanceinfolist);
1005 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1006 _("Maintenance command for printing GDB internal state."),
1007 &maintenanceprintlist, "maintenance print ", 0,
1010 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
1011 Set GDB internal variables used by the GDB maintainer.\n\
1012 Configure variables internal to GDB that aid in GDB's maintenance"),
1013 &maintenance_set_cmdlist, "maintenance set ",
1017 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
1018 Show GDB internal variables used by the GDB maintainer.\n\
1019 Configure variables internal to GDB that aid in GDB's maintenance"),
1020 &maintenance_show_cmdlist, "maintenance show ",
1025 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
1026 Get fatal error; make debugger dump its core.\n\
1027 GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1028 itself a SIGQUIT signal."),
1032 add_cmd ("internal-error", class_maintenance,
1033 maintenance_internal_error, _("\
1034 Give GDB an internal error.\n\
1035 Cause GDB to behave as if an internal error was detected."),
1038 add_cmd ("internal-warning", class_maintenance,
1039 maintenance_internal_warning, _("\
1040 Give GDB an internal warning.\n\
1041 Cause GDB to behave as if an internal warning was reported."),
1044 add_cmd ("demangler-warning", class_maintenance,
1045 maintenance_demangler_warning, _("\
1046 Give GDB a demangler warning.\n\
1047 Cause GDB to behave as if a demangler warning was reported."),
1050 cmd = add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
1051 This command has been moved to \"demangle\"."),
1053 deprecate_cmd (cmd, "demangle");
1055 add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
1056 Per-command statistics settings."),
1057 &per_command_setlist, "set per-command ",
1058 1/*allow-unknown*/, &maintenance_set_cmdlist);
1060 add_prefix_cmd ("per-command", class_maintenance, show_per_command_cmd, _("\
1061 Show per-command statistics settings."),
1062 &per_command_showlist, "show per-command ",
1063 0/*allow-unknown*/, &maintenance_show_cmdlist);
1065 add_setshow_boolean_cmd ("time", class_maintenance,
1066 &per_command_time, _("\
1067 Set whether to display per-command execution time."), _("\
1068 Show whether to display per-command execution time."),
1070 If enabled, the execution time for each command will be\n\
1071 displayed following the command's output."),
1073 &per_command_setlist, &per_command_showlist);
1075 add_setshow_boolean_cmd ("space", class_maintenance,
1076 &per_command_space, _("\
1077 Set whether to display per-command space usage."), _("\
1078 Show whether to display per-command space usage."),
1080 If enabled, the space usage for each command will be\n\
1081 displayed following the command's output."),
1083 &per_command_setlist, &per_command_showlist);
1085 add_setshow_boolean_cmd ("symtab", class_maintenance,
1086 &per_command_symtab, _("\
1087 Set whether to display per-command symtab statistics."), _("\
1088 Show whether to display per-command symtab statistics."),
1090 If enabled, the basic symtab statistics for each command will be\n\
1091 displayed following the command's output."),
1093 &per_command_setlist, &per_command_showlist);
1095 /* This is equivalent to "mt set per-command time on".
1096 Kept because some people are used to typing "mt time 1". */
1097 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
1098 Set the display of time usage.\n\
1099 If nonzero, will cause the execution time for each command to be\n\
1100 displayed, following the command's output."),
1103 /* This is equivalent to "mt set per-command space on".
1104 Kept because some people are used to typing "mt space 1". */
1105 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
1106 Set the display of space usage.\n\
1107 If nonzero, will cause the execution space for each command to be\n\
1108 displayed, following the command's output."),
1111 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
1112 Print a type chain for a given symbol.\n\
1113 For each node in a type chain, print the raw data for each member of\n\
1114 the type structure, and the interpretation of the data."),
1115 &maintenanceprintlist);
1117 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1118 _("Print statistics about internal gdb state."),
1119 &maintenanceprintlist);
1121 add_cmd ("architecture", class_maintenance,
1122 maintenance_print_architecture, _("\
1123 Print the internal architecture configuration.\n\
1124 Takes an optional file parameter."),
1125 &maintenanceprintlist);
1127 add_prefix_cmd ("check", class_maintenance, maintenance_check_command, _("\
1128 Commands for checking internal gdb state."),
1129 &maintenancechecklist, "maintenance check ", 0,
1132 add_cmd ("translate-address", class_maintenance,
1133 maintenance_translate_address,
1134 _("Translate a section name and address to a symbol."),
1137 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
1138 Deprecate a command. Note that this is just in here so the \n\
1139 testsuite can check the command deprecator. You probably shouldn't use this,\n\
1140 rather you should use the C function deprecate_cmd(). If you decide you \n\
1141 want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1142 replacement is optional."), &maintenancelist);
1144 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
1145 Undeprecate a command. Note that this is just in here so the \n\
1146 testsuite can check the command deprecator. You probably shouldn't use this,\n\
1147 If you decide you want to use it: maintenance undeprecate 'commandname'"),
1150 add_cmd ("selftest", class_maintenance, maintenance_selftest, _("\
1151 Run gdb's unit tests.\n\
1152 Usage: maintenance selftest [filter]\n\
1153 This will run any unit tests that were built in to gdb.\n\
1154 If a filter is given, only the tests with that value in their name will ran."),
1157 add_cmd ("selftests", class_maintenance, maintenance_info_selftests,
1158 _("List the registered selftests."), &maintenanceinfolist);
1160 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
1161 Set watchdog timer."), _("\
1162 Show watchdog timer."), _("\
1163 When non-zero, this timeout is used instead of waiting forever for a target\n\
1164 to finish a low-level step or continue operation. If the specified amount\n\
1165 of time passes without a response from the target, an error occurs."),
1168 &setlist, &showlist);
1170 add_setshow_boolean_cmd ("profile", class_maintenance,
1171 &maintenance_profile_p, _("\
1172 Set internal profiling."), _("\
1173 Show internal profiling."), _("\
1174 When enabled GDB is profiled."),
1175 maintenance_set_profile_cmd,
1176 show_maintenance_profile_p,
1177 &maintenance_set_cmdlist,
1178 &maintenance_show_cmdlist);