]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/maint.c
Add selftests run filtering
[thirdparty/binutils-gdb.git] / gdb / maint.c
1 /* Support for GDB maintenance commands.
2
3 Copyright (C) 1992-2017 Free Software Foundation, Inc.
4
5 Written by Fred Fish at Cygnus Support.
6
7 This file is part of GDB.
8
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.
13
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.
18
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/>. */
21
22
23 #include "defs.h"
24 #include "arch-utils.h"
25 #include <ctype.h>
26 #include <signal.h>
27 #include "command.h"
28 #include "gdbcmd.h"
29 #include "symtab.h"
30 #include "block.h"
31 #include "gdbtypes.h"
32 #include "demangle.h"
33 #include "gdbcore.h"
34 #include "expression.h" /* For language.h */
35 #include "language.h"
36 #include "symfile.h"
37 #include "objfiles.h"
38 #include "value.h"
39 #include "top.h"
40 #include "maint.h"
41 #include "selftest.h"
42
43 #include "cli/cli-decode.h"
44 #include "cli/cli-utils.h"
45 #include "cli/cli-setshow.h"
46
47 static void maintenance_command (char *, int);
48
49 static void maintenance_internal_error (char *args, int from_tty);
50
51 static void maintenance_demangle (char *, int);
52
53 static void maintenance_time_display (char *, int);
54
55 static void maintenance_space_display (char *, int);
56
57 static void maintenance_info_command (char *, int);
58
59 static void maintenance_info_sections (char *, int);
60
61 static void maintenance_print_command (char *, int);
62
63 static void maintenance_do_deprecate (char *, int);
64
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. */
70
71 int watchdog = 0;
72 static void
73 show_watchdog (struct ui_file *file, int from_tty,
74 struct cmd_list_element *c, const char *value)
75 {
76 fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
77 }
78
79 /* Access the maintenance subcommands. */
80
81 static void
82 maintenance_command (char *args, int from_tty)
83 {
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);
87 }
88
89 #ifndef _WIN32
90 static void
91 maintenance_dump_me (char *args, int from_tty)
92 {
93 if (query (_("Should GDB dump core? ")))
94 {
95 #ifdef __DJGPP__
96 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
97 signal (SIGABRT, SIG_DFL);
98 kill (getpid (), SIGABRT);
99 #else
100 signal (SIGQUIT, SIG_DFL);
101 kill (getpid (), SIGQUIT);
102 #endif
103 }
104 }
105 #endif
106
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
110 GDB. */
111
112 static void
113 maintenance_internal_error (char *args, int from_tty)
114 {
115 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
116 }
117
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
121 GDB. */
122
123 static void
124 maintenance_internal_warning (char *args, int from_tty)
125 {
126 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
127 }
128
129 /* Stimulate the internal error mechanism that GDB uses when an
130 demangler problem is detected. Allows testing of the mechanism. */
131
132 static void
133 maintenance_demangler_warning (char *args, int from_tty)
134 {
135 demangler_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
136 }
137
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. */
141
142 static void
143 maintenance_demangle (char *args, int from_tty)
144 {
145 printf_filtered (_("This command has been moved to \"demangle\".\n"));
146 }
147
148 static void
149 maintenance_time_display (char *args, int from_tty)
150 {
151 if (args == NULL || *args == '\0')
152 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
153 else
154 set_per_command_time (strtol (args, NULL, 10));
155 }
156
157 static void
158 maintenance_space_display (char *args, int from_tty)
159 {
160 if (args == NULL || *args == '\0')
161 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
162 else
163 set_per_command_space (strtol (args, NULL, 10));
164 }
165
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. */
169
170 static void
171 maintenance_info_command (char *arg, int from_tty)
172 {
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,
176 gdb_stdout);
177 }
178
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. */
182
183 static void
184 maintenance_check_command (char *arg, int from_tty)
185 {
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,
189 gdb_stdout);
190 }
191
192 /* Mini tokenizing lexer for 'maint info sections' command. */
193
194 static int
195 match_substring (const char *string, const char *substr)
196 {
197 int substr_len = strlen(substr);
198 const char *tok;
199
200 while ((tok = strstr (string, substr)) != NULL)
201 {
202 /* Got a partial match. Is it a whole word? */
203 if (tok == string
204 || tok[-1] == ' '
205 || tok[-1] == '\t')
206 {
207 /* Token is delimited at the front... */
208 if (tok[substr_len] == ' '
209 || tok[substr_len] == '\t'
210 || tok[substr_len] == '\0')
211 {
212 /* Token is delimited at the rear. Got a whole-word match. */
213 return 1;
214 }
215 }
216 /* Token didn't match as a whole word. Advance and try again. */
217 string = tok + 1;
218 }
219 return 0;
220 }
221
222 static int
223 match_bfd_flags (const char *string, flagword flags)
224 {
225 if (flags & SEC_ALLOC)
226 if (match_substring (string, "ALLOC"))
227 return 1;
228 if (flags & SEC_LOAD)
229 if (match_substring (string, "LOAD"))
230 return 1;
231 if (flags & SEC_RELOC)
232 if (match_substring (string, "RELOC"))
233 return 1;
234 if (flags & SEC_READONLY)
235 if (match_substring (string, "READONLY"))
236 return 1;
237 if (flags & SEC_CODE)
238 if (match_substring (string, "CODE"))
239 return 1;
240 if (flags & SEC_DATA)
241 if (match_substring (string, "DATA"))
242 return 1;
243 if (flags & SEC_ROM)
244 if (match_substring (string, "ROM"))
245 return 1;
246 if (flags & SEC_CONSTRUCTOR)
247 if (match_substring (string, "CONSTRUCTOR"))
248 return 1;
249 if (flags & SEC_HAS_CONTENTS)
250 if (match_substring (string, "HAS_CONTENTS"))
251 return 1;
252 if (flags & SEC_NEVER_LOAD)
253 if (match_substring (string, "NEVER_LOAD"))
254 return 1;
255 if (flags & SEC_COFF_SHARED_LIBRARY)
256 if (match_substring (string, "COFF_SHARED_LIBRARY"))
257 return 1;
258 if (flags & SEC_IS_COMMON)
259 if (match_substring (string, "IS_COMMON"))
260 return 1;
261
262 return 0;
263 }
264
265 static void
266 print_bfd_flags (flagword flags)
267 {
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");
280 if (flags & SEC_ROM)
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");
292 }
293
294 static void
295 maint_print_section_info (const char *name, flagword flags,
296 CORE_ADDR addr, CORE_ADDR endaddr,
297 unsigned long filepos, int addr_size)
298 {
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");
306 }
307
308 static void
309 print_bfd_section_info (bfd *abfd,
310 asection *asect,
311 void *datum)
312 {
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;
316
317 if (arg == NULL || *arg == '\0'
318 || match_substring (arg, name)
319 || match_bfd_flags (arg, flags))
320 {
321 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
322 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
323 CORE_ADDR addr, endaddr;
324
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);
330 }
331 }
332
333 static void
334 print_objfile_section_info (bfd *abfd,
335 struct obj_section *asect,
336 const char *string)
337 {
338 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
339 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
340
341 if (string == NULL || *string == '\0'
342 || match_substring (string, name)
343 || match_bfd_flags (string, flags))
344 {
345 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
346 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
347
348 maint_print_section_info (name, flags,
349 obj_section_addr (asect),
350 obj_section_endaddr (asect),
351 asect->the_bfd_section->filepos,
352 addr_size);
353 }
354 }
355
356 static void
357 maintenance_info_sections (char *arg, int from_tty)
358 {
359 if (exec_bfd)
360 {
361 printf_filtered (_("Exec file:\n"));
362 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
363 wrap_here (" ");
364 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
365 if (arg && *arg && match_substring (arg, "ALLOBJ"))
366 {
367 struct objfile *ofile;
368 struct obj_section *osect;
369
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)
375 arg = NULL;
376
377 ALL_OBJFILES (ofile)
378 {
379 printf_filtered (_(" Object file: %s\n"),
380 bfd_get_filename (ofile->obfd));
381 ALL_OBJFILE_OSECTIONS (ofile, osect)
382 {
383 print_objfile_section_info (ofile->obfd, osect, arg);
384 }
385 }
386 }
387 else
388 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
389 }
390
391 if (core_bfd)
392 {
393 printf_filtered (_("Core file:\n"));
394 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
395 wrap_here (" ");
396 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
397 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
398 }
399 }
400
401 static void
402 maintenance_print_statistics (char *args, int from_tty)
403 {
404 print_objfile_statistics ();
405 print_symbol_bcache_statistics ();
406 }
407
408 static void
409 maintenance_print_architecture (char *args, int from_tty)
410 {
411 struct gdbarch *gdbarch = get_current_arch ();
412
413 if (args == NULL)
414 gdbarch_dump (gdbarch, gdb_stdout);
415 else
416 {
417 stdio_file file;
418
419 if (!file.open (args, "w"))
420 perror_with_name (_("maintenance print architecture"));
421 gdbarch_dump (gdbarch, &file);
422 }
423 }
424
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. */
428
429 static void
430 maintenance_print_command (char *arg, int from_tty)
431 {
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,
435 gdb_stdout);
436 }
437
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>. */
442
443 static void
444 maintenance_translate_address (char *arg, int from_tty)
445 {
446 CORE_ADDR address;
447 struct obj_section *sect;
448 char *p;
449 struct bound_minimal_symbol sym;
450 struct objfile *objfile;
451
452 if (arg == NULL || *arg == 0)
453 error (_("requires argument (address or section + address)"));
454
455 sect = NULL;
456 p = arg;
457
458 if (!isdigit (*p))
459 { /* See if we have a valid section name. */
460 while (*p && !isspace (*p)) /* Find end of section name. */
461 p++;
462 if (*p == '\000') /* End of command? */
463 error (_("Need to specify <section-name> and <address>"));
464 *p++ = '\000';
465 p = skip_spaces (p);
466
467 ALL_OBJSECTIONS (objfile, sect)
468 {
469 if (strcmp (sect->the_bfd_section->name, arg) == 0)
470 break;
471 }
472
473 if (!objfile)
474 error (_("Unknown section %s."), arg);
475 }
476
477 address = parse_and_eval_address (p);
478
479 if (sect)
480 sym = lookup_minimal_symbol_by_pc_section (address, sect);
481 else
482 sym = lookup_minimal_symbol_by_pc (address);
483
484 if (sym.minsym)
485 {
486 const char *symbol_name = MSYMBOL_PRINT_NAME (sym.minsym);
487 const char *symbol_offset
488 = pulongest (address - BMSYMBOL_VALUE_ADDRESS (sym));
489
490 sect = MSYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
491 if (sect != NULL)
492 {
493 const char *section_name;
494 const char *obj_name;
495
496 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
497 section_name = sect->the_bfd_section->name;
498
499 gdb_assert (sect->objfile && objfile_name (sect->objfile));
500 obj_name = objfile_name (sect->objfile);
501
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);
506 else
507 printf_filtered (_("%s + %s in section %s\n"),
508 symbol_name, symbol_offset, section_name);
509 }
510 else
511 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
512 }
513 else if (sect)
514 printf_filtered (_("no symbol at %s:%s\n"),
515 sect->the_bfd_section->name, hex_string (address));
516 else
517 printf_filtered (_("no symbol at %s\n"), hex_string (address));
518
519 return;
520 }
521
522
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
525 offered. */
526
527 static void
528 maintenance_deprecate (char *args, int from_tty)
529 {
530 if (args == NULL || *args == '\0')
531 {
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"));
535 }
536
537 maintenance_do_deprecate (args, 1);
538
539 }
540
541
542 static void
543 maintenance_undeprecate (char *args, int from_tty)
544 {
545 if (args == NULL || *args == '\0')
546 {
547 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
548 the command you want to undeprecate.\n"));
549 }
550
551 maintenance_do_deprecate (args, 0);
552
553 }
554
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().
558
559 This function deprecates a command and optionally assigns it a
560 replacement. */
561
562 static void
563 maintenance_do_deprecate (char *text, int deprecate)
564 {
565 struct cmd_list_element *alias = NULL;
566 struct cmd_list_element *prefix_cmd = NULL;
567 struct cmd_list_element *cmd = NULL;
568
569 char *start_ptr = NULL;
570 char *end_ptr = NULL;
571 int len;
572 char *replacement = NULL;
573
574 if (text == NULL)
575 return;
576
577 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
578 {
579 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
580 return;
581 }
582
583 if (deprecate)
584 {
585 /* Look for a replacement command. */
586 start_ptr = strchr (text, '\"');
587 if (start_ptr != NULL)
588 {
589 start_ptr++;
590 end_ptr = strrchr (start_ptr, '\"');
591 if (end_ptr != NULL)
592 {
593 len = end_ptr - start_ptr;
594 start_ptr[len] = '\0';
595 replacement = xstrdup (start_ptr);
596 }
597 }
598 }
599
600 if (!start_ptr || !end_ptr)
601 replacement = NULL;
602
603
604 /* If they used an alias, we only want to deprecate the alias.
605
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
608 memory. */
609 if (alias)
610 {
611 if (alias->malloced_replacement)
612 xfree ((char *) alias->replacement);
613
614 if (deprecate)
615 {
616 alias->deprecated_warn_user = 1;
617 alias->cmd_deprecated = 1;
618 }
619 else
620 {
621 alias->deprecated_warn_user = 0;
622 alias->cmd_deprecated = 0;
623 }
624 alias->replacement = replacement;
625 alias->malloced_replacement = 1;
626 return;
627 }
628 else if (cmd)
629 {
630 if (cmd->malloced_replacement)
631 xfree ((char *) cmd->replacement);
632
633 if (deprecate)
634 {
635 cmd->deprecated_warn_user = 1;
636 cmd->cmd_deprecated = 1;
637 }
638 else
639 {
640 cmd->deprecated_warn_user = 0;
641 cmd->cmd_deprecated = 0;
642 }
643 cmd->replacement = replacement;
644 cmd->malloced_replacement = 1;
645 return;
646 }
647 xfree (replacement);
648 }
649
650 /* Maintenance set/show framework. */
651
652 struct cmd_list_element *maintenance_set_cmdlist;
653 struct cmd_list_element *maintenance_show_cmdlist;
654
655 static void
656 maintenance_set_cmd (char *args, int from_tty)
657 {
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,
661 gdb_stdout);
662 }
663
664 static void
665 maintenance_show_cmd (char *args, int from_tty)
666 {
667 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
668 }
669
670 /* Profiling support. */
671
672 static int maintenance_profile_p;
673 static void
674 show_maintenance_profile_p (struct ui_file *file, int from_tty,
675 struct cmd_list_element *c, const char *value)
676 {
677 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
678 }
679
680 #ifdef HAVE__ETEXT
681 extern char _etext;
682 #define TEXTEND &_etext
683 #elif defined (HAVE_ETEXT)
684 extern char etext;
685 #define TEXTEND &etext
686 #endif
687
688 #if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
689
690 static int profiling_state;
691
692 EXTERN_C void _mcleanup (void);
693
694 static void
695 mcleanup_wrapper (void)
696 {
697 if (profiling_state)
698 _mcleanup ();
699 }
700
701 EXTERN_C void monstartup (unsigned long, unsigned long);
702 extern int main ();
703
704 static void
705 maintenance_set_profile_cmd (char *args, int from_tty,
706 struct cmd_list_element *c)
707 {
708 if (maintenance_profile_p == profiling_state)
709 return;
710
711 profiling_state = maintenance_profile_p;
712
713 if (maintenance_profile_p)
714 {
715 static int profiling_initialized;
716
717 if (!profiling_initialized)
718 {
719 atexit (mcleanup_wrapper);
720 profiling_initialized = 1;
721 }
722
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);
726 }
727 else
728 {
729 extern void _mcleanup (void);
730
731 _mcleanup ();
732 }
733 }
734 #else
735 static void
736 maintenance_set_profile_cmd (char *args, int from_tty,
737 struct cmd_list_element *c)
738 {
739 error (_("Profiling support is not available on this system."));
740 }
741 #endif
742 \f
743 /* If nonzero, display time usage both at startup and for each command. */
744
745 static int per_command_time;
746
747 /* If nonzero, display space usage both at startup and for each command. */
748
749 static int per_command_space;
750
751 /* If nonzero, display basic symtab stats for each command. */
752
753 static int per_command_symtab;
754
755 /* mt per-command commands. */
756
757 static struct cmd_list_element *per_command_setlist;
758 static struct cmd_list_element *per_command_showlist;
759
760 /* Set whether to display time statistics to NEW_VALUE
761 (non-zero means true). */
762
763 void
764 set_per_command_time (int new_value)
765 {
766 per_command_time = new_value;
767 }
768
769 /* Set whether to display space statistics to NEW_VALUE
770 (non-zero means true). */
771
772 void
773 set_per_command_space (int new_value)
774 {
775 per_command_space = new_value;
776 }
777
778 /* Count the number of symtabs and blocks. */
779
780 static void
781 count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_compunit_symtabs_ptr,
782 int *nr_blocks_ptr)
783 {
784 struct objfile *o;
785 struct compunit_symtab *cu;
786 struct symtab *s;
787 int nr_symtabs = 0;
788 int nr_compunit_symtabs = 0;
789 int nr_blocks = 0;
790
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)
795 {
796 ALL_COMPUNITS (o, cu)
797 {
798 ++nr_compunit_symtabs;
799 nr_blocks += BLOCKVECTOR_NBLOCKS (COMPUNIT_BLOCKVECTOR (cu));
800 ALL_COMPUNIT_FILETABS (cu, s)
801 ++nr_symtabs;
802 }
803 }
804
805 *nr_symtabs_ptr = nr_symtabs;
806 *nr_compunit_symtabs_ptr = nr_compunit_symtabs;
807 *nr_blocks_ptr = nr_blocks;
808 }
809
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
812 in this object. */
813
814 scoped_command_stats::~scoped_command_stats ()
815 {
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. */
822 if (m_msg_type
823 && !per_command_time
824 && !per_command_space
825 && !per_command_symtab)
826 return;
827
828 if (m_time_enabled && per_command_time)
829 {
830 using namespace std::chrono;
831
832 run_time_clock::duration cmd_time
833 = run_time_clock::now () - m_start_cpu_time;
834
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 ();
839
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 ());
845 }
846
847 if (m_space_enabled && per_command_space)
848 {
849 #ifdef HAVE_SBRK
850 char *lim = (char *) sbrk (0);
851
852 long space_now = lim - lim_at_start;
853 long space_diff = space_now - m_start_space;
854
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"),
858 space_now,
859 (space_diff >= 0 ? "+" : ""),
860 space_diff);
861 #endif
862 }
863
864 if (m_symtab_enabled && per_command_symtab)
865 {
866 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
867
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"),
872 nr_symtabs,
873 nr_symtabs - m_start_nr_symtabs,
874 nr_compunit_symtabs,
875 (nr_compunit_symtabs
876 - m_start_nr_compunit_symtabs),
877 nr_blocks,
878 nr_blocks - m_start_nr_blocks);
879 }
880 }
881
882 scoped_command_stats::scoped_command_stats (bool msg_type)
883 : m_msg_type (msg_type)
884 {
885 if (!m_msg_type || per_command_space)
886 {
887 #ifdef HAVE_SBRK
888 char *lim = (char *) sbrk (0);
889 m_start_space = lim - lim_at_start;
890 m_space_enabled = 1;
891 #endif
892 }
893 else
894 m_space_enabled = 0;
895
896 if (msg_type == 0 || per_command_time)
897 {
898 using namespace std::chrono;
899
900 m_start_cpu_time = run_time_clock::now ();
901 m_start_wall_time = steady_clock::now ();
902 m_time_enabled = 1;
903 }
904 else
905 m_time_enabled = 0;
906
907 if (msg_type == 0 || per_command_symtab)
908 {
909 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
910
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;
916 }
917 else
918 m_symtab_enabled = 0;
919
920 /* Initialize timer to keep track of how long we waited for the user. */
921 reset_prompt_for_continue_wait_time ();
922 }
923
924 /* Handle unknown "mt set per-command" arguments.
925 In this case have "mt set per-command on|off" affect every setting. */
926
927 static void
928 set_per_command_cmd (char *args, int from_tty)
929 {
930 struct cmd_list_element *list;
931 int val;
932
933 val = parse_cli_boolean_value (args);
934 if (val < 0)
935 error (_("Bad value for 'mt set per-command no'."));
936
937 for (list = per_command_setlist; list != NULL; list = list->next)
938 if (list->var_type == var_boolean)
939 {
940 gdb_assert (list->type == set_cmd);
941 do_set_command (args, from_tty, list);
942 }
943 }
944
945 /* Command "show per-command" displays summary of all the current
946 "show per-command " settings. */
947
948 static void
949 show_per_command_cmd (char *args, int from_tty)
950 {
951 cmd_show_list (per_command_showlist, from_tty, "");
952 }
953 \f
954
955 /* The "maintenance selftest" command. */
956
957 static void
958 maintenance_selftest (char *args, int from_tty)
959 {
960 selftests::run_tests (args);
961 }
962
963 static void
964 maintenance_info_selftests (char *arg, int from_tty)
965 {
966 printf_filtered ("Registered selftests:\n");
967 selftests::for_each_selftest ([] (const std::string &name) {
968 printf_filtered (" - %s\n", name.c_str ());
969 });
970 }
971
972 \f
973 void
974 _initialize_maint_cmds (void)
975 {
976 struct cmd_list_element *cmd;
977
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,
983 &cmdlist);
984
985 add_com_alias ("mt", "maintenance", class_maintenance, 1);
986
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,
990 &maintenancelist);
991 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
992
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\
1001 ALLOBJ\n\
1002 lists all sections from all object files, including shared libraries."),
1003 &maintenanceinfolist);
1004
1005 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1006 _("Maintenance command for printing GDB internal state."),
1007 &maintenanceprintlist, "maintenance print ", 0,
1008 &maintenancelist);
1009
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 ",
1014 0/*allow-unknown*/,
1015 &maintenancelist);
1016
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 ",
1021 0/*allow-unknown*/,
1022 &maintenancelist);
1023
1024 #ifndef _WIN32
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."),
1029 &maintenancelist);
1030 #endif
1031
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."),
1036 &maintenancelist);
1037
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."),
1042 &maintenancelist);
1043
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."),
1048 &maintenancelist);
1049
1050 cmd = add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
1051 This command has been moved to \"demangle\"."),
1052 &maintenancelist);
1053 deprecate_cmd (cmd, "demangle");
1054
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);
1059
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);
1064
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."),
1069 _("\
1070 If enabled, the execution time for each command will be\n\
1071 displayed following the command's output."),
1072 NULL, NULL,
1073 &per_command_setlist, &per_command_showlist);
1074
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."),
1079 _("\
1080 If enabled, the space usage for each command will be\n\
1081 displayed following the command's output."),
1082 NULL, NULL,
1083 &per_command_setlist, &per_command_showlist);
1084
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."),
1089 _("\
1090 If enabled, the basic symtab statistics for each command will be\n\
1091 displayed following the command's output."),
1092 NULL, NULL,
1093 &per_command_setlist, &per_command_showlist);
1094
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."),
1101 &maintenancelist);
1102
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."),
1109 &maintenancelist);
1110
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);
1116
1117 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1118 _("Print statistics about internal gdb state."),
1119 &maintenanceprintlist);
1120
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);
1126
1127 add_prefix_cmd ("check", class_maintenance, maintenance_check_command, _("\
1128 Commands for checking internal gdb state."),
1129 &maintenancechecklist, "maintenance check ", 0,
1130 &maintenancelist);
1131
1132 add_cmd ("translate-address", class_maintenance,
1133 maintenance_translate_address,
1134 _("Translate a section name and address to a symbol."),
1135 &maintenancelist);
1136
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);
1143
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'"),
1148 &maintenancelist);
1149
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."),
1155 &maintenancelist);
1156
1157 add_cmd ("selftests", class_maintenance, maintenance_info_selftests,
1158 _("List the registered selftests."), &maintenanceinfolist);
1159
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."),
1166 NULL,
1167 show_watchdog,
1168 &setlist, &showlist);
1169
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);
1179 }