1 /* Support for GDB maintenance commands.
3 Copyright (C) 1992-2020 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"
35 #include "expression.h" /* For language.h */
42 #include "gdbsupport/selftest.h"
44 #include "cli/cli-decode.h"
45 #include "cli/cli-utils.h"
46 #include "cli/cli-setshow.h"
47 #include "cli/cli-cmds.h"
50 #include "gdbsupport/thread-pool.h"
53 static void maintenance_do_deprecate (const char *, int);
55 /* Access the maintenance subcommands. */
58 maintenance_command (const char *args
, int from_tty
)
60 printf_unfiltered (_("\"maintenance\" must be followed by "
61 "the name of a maintenance command.\n"));
62 help_list (maintenancelist
, "maintenance ", all_commands
, gdb_stdout
);
67 maintenance_dump_me (const char *args
, int from_tty
)
69 if (query (_("Should GDB dump core? ")))
72 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
73 signal (SIGABRT
, SIG_DFL
);
74 kill (getpid (), SIGABRT
);
76 signal (SIGQUIT
, SIG_DFL
);
77 kill (getpid (), SIGQUIT
);
83 /* Stimulate the internal error mechanism that GDB uses when an
84 internal problem is detected. Allows testing of the mechanism.
85 Also useful when the user wants to drop a core file but not exit
89 maintenance_internal_error (const char *args
, int from_tty
)
91 internal_error (__FILE__
, __LINE__
, "%s", (args
== NULL
? "" : args
));
94 /* Stimulate the internal error mechanism that GDB uses when an
95 internal problem is detected. Allows testing of the mechanism.
96 Also useful when the user wants to drop a core file but not exit
100 maintenance_internal_warning (const char *args
, int from_tty
)
102 internal_warning (__FILE__
, __LINE__
, "%s", (args
== NULL
? "" : args
));
105 /* Stimulate the internal error mechanism that GDB uses when an
106 demangler problem is detected. Allows testing of the mechanism. */
109 maintenance_demangler_warning (const char *args
, int from_tty
)
111 demangler_warning (__FILE__
, __LINE__
, "%s", (args
== NULL
? "" : args
));
114 /* Old command to demangle a string. The command has been moved to "demangle".
115 It is kept for now because otherwise "mt demangle" gets interpreted as
116 "mt demangler-warning" which artificially creates an internal gdb error. */
119 maintenance_demangle (const char *args
, int from_tty
)
121 printf_filtered (_("This command has been moved to \"demangle\".\n"));
125 maintenance_time_display (const char *args
, int from_tty
)
127 if (args
== NULL
|| *args
== '\0')
128 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
130 set_per_command_time (strtol (args
, NULL
, 10));
134 maintenance_space_display (const char *args
, int from_tty
)
136 if (args
== NULL
|| *args
== '\0')
137 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
139 set_per_command_space (strtol (args
, NULL
, 10));
142 /* The "maintenance info" command is defined as a prefix, with
143 allow_unknown 0. Therefore, its own definition is called only for
144 "maintenance info" with no args. */
147 maintenance_info_command (const char *arg
, int from_tty
)
149 printf_unfiltered (_("\"maintenance info\" must be followed "
150 "by the name of an info command.\n"));
151 help_list (maintenanceinfolist
, "maintenance info ", all_commands
,
155 /* The "maintenance check" command is defined as a prefix, with
156 allow_unknown 0. Therefore, its own definition is called only for
157 "maintenance check" with no args. */
160 maintenance_check_command (const char *arg
, int from_tty
)
162 printf_unfiltered (_("\"maintenance check\" must be followed "
163 "by the name of a check command.\n"));
164 help_list (maintenancechecklist
, "maintenance check ", all_commands
,
168 /* Mini tokenizing lexer for 'maint info sections' command. */
171 match_substring (const char *string
, const char *substr
)
173 int substr_len
= strlen(substr
);
176 while ((tok
= strstr (string
, substr
)) != NULL
)
178 /* Got a partial match. Is it a whole word? */
183 /* Token is delimited at the front... */
184 if (tok
[substr_len
] == ' '
185 || tok
[substr_len
] == '\t'
186 || tok
[substr_len
] == '\0')
188 /* Token is delimited at the rear. Got a whole-word match. */
192 /* Token didn't match as a whole word. Advance and try again. */
199 match_bfd_flags (const char *string
, flagword flags
)
201 if (flags
& SEC_ALLOC
)
202 if (match_substring (string
, "ALLOC"))
204 if (flags
& SEC_LOAD
)
205 if (match_substring (string
, "LOAD"))
207 if (flags
& SEC_RELOC
)
208 if (match_substring (string
, "RELOC"))
210 if (flags
& SEC_READONLY
)
211 if (match_substring (string
, "READONLY"))
213 if (flags
& SEC_CODE
)
214 if (match_substring (string
, "CODE"))
216 if (flags
& SEC_DATA
)
217 if (match_substring (string
, "DATA"))
220 if (match_substring (string
, "ROM"))
222 if (flags
& SEC_CONSTRUCTOR
)
223 if (match_substring (string
, "CONSTRUCTOR"))
225 if (flags
& SEC_HAS_CONTENTS
)
226 if (match_substring (string
, "HAS_CONTENTS"))
228 if (flags
& SEC_NEVER_LOAD
)
229 if (match_substring (string
, "NEVER_LOAD"))
231 if (flags
& SEC_COFF_SHARED_LIBRARY
)
232 if (match_substring (string
, "COFF_SHARED_LIBRARY"))
234 if (flags
& SEC_IS_COMMON
)
235 if (match_substring (string
, "IS_COMMON"))
242 print_bfd_flags (flagword flags
)
244 if (flags
& SEC_ALLOC
)
245 printf_filtered (" ALLOC");
246 if (flags
& SEC_LOAD
)
247 printf_filtered (" LOAD");
248 if (flags
& SEC_RELOC
)
249 printf_filtered (" RELOC");
250 if (flags
& SEC_READONLY
)
251 printf_filtered (" READONLY");
252 if (flags
& SEC_CODE
)
253 printf_filtered (" CODE");
254 if (flags
& SEC_DATA
)
255 printf_filtered (" DATA");
257 printf_filtered (" ROM");
258 if (flags
& SEC_CONSTRUCTOR
)
259 printf_filtered (" CONSTRUCTOR");
260 if (flags
& SEC_HAS_CONTENTS
)
261 printf_filtered (" HAS_CONTENTS");
262 if (flags
& SEC_NEVER_LOAD
)
263 printf_filtered (" NEVER_LOAD");
264 if (flags
& SEC_COFF_SHARED_LIBRARY
)
265 printf_filtered (" COFF_SHARED_LIBRARY");
266 if (flags
& SEC_IS_COMMON
)
267 printf_filtered (" IS_COMMON");
271 maint_print_section_info (const char *name
, flagword flags
,
272 CORE_ADDR addr
, CORE_ADDR endaddr
,
273 unsigned long filepos
, int addr_size
)
275 printf_filtered (" %s", hex_string_custom (addr
, addr_size
));
276 printf_filtered ("->%s", hex_string_custom (endaddr
, addr_size
));
277 printf_filtered (" at %s",
278 hex_string_custom ((unsigned long) filepos
, 8));
279 printf_filtered (": %s", name
);
280 print_bfd_flags (flags
);
281 printf_filtered ("\n");
284 /* Information passed between the "maintenance info sections" command, and
285 the worker function that prints each section. */
286 struct maint_print_section_data
288 /* The GDB objfile we're printing this section for. */
289 struct objfile
*objfile
;
291 /* The argument string passed by the user to the top level maintenance
292 info sections command. Used for filtering which sections are
296 /* The number of digits in the highest section index for all sections
297 from the bfd object associated with OBJFILE. Used when pretty
298 printing the index number to ensure all of the indexes line up. */
302 maint_print_section_data (struct objfile
*objfile
, const char *arg
,
307 int section_count
= gdb_bfd_count_sections (abfd
);
308 index_digits
= ((int) log10 ((float) section_count
)) + 1;
312 maint_print_section_data () = delete;
313 maint_print_section_data (const maint_print_section_data
&) = delete;
316 /* Helper function to pretty-print the section index of ASECT from ABFD.
317 The INDEX_DIGITS is the number of digits in the largest index that will
318 be printed, and is used to pretty-print the resulting string. */
321 print_section_index (bfd
*abfd
,
326 = string_printf (" [%d] ", gdb_bfd_section_index (abfd
, asect
));
327 /* The '+ 4' for the leading and trailing characters. */
328 printf_filtered ("%-*s", (index_digits
+ 4), result
.c_str ());
331 /* Print information about ASECT from ABFD. DATUM holds a pointer to a
332 maint_print_section_data object. The section will be printed using the
333 VMA's from the bfd, which will not be the relocated addresses for bfds
334 that should be relocated. The information must be printed with the
335 same layout as PRINT_OBJFILE_SECTION_INFO below. */
338 print_bfd_section_info (bfd
*abfd
,
342 flagword flags
= bfd_section_flags (asect
);
343 const char *name
= bfd_section_name (asect
);
344 maint_print_section_data
*print_data
= (maint_print_section_data
*) datum
;
345 const char *arg
= print_data
->arg
;
347 if (arg
== NULL
|| *arg
== '\0'
348 || match_substring (arg
, name
)
349 || match_bfd_flags (arg
, flags
))
351 struct gdbarch
*gdbarch
= gdbarch_from_bfd (abfd
);
352 int addr_size
= gdbarch_addr_bit (gdbarch
) / 8;
353 CORE_ADDR addr
, endaddr
;
355 addr
= bfd_section_vma (asect
);
356 endaddr
= addr
+ bfd_section_size (asect
);
357 print_section_index (abfd
, asect
, print_data
->index_digits
);
358 maint_print_section_info (name
, flags
, addr
, endaddr
,
359 asect
->filepos
, addr_size
);
363 /* Print information about ASECT which is GDB's wrapper around a section
364 from ABFD. The information must be printed with the same layout as
365 PRINT_BFD_SECTION_INFO above. PRINT_DATA holds information used to
366 filter which sections are printed, and for formatting the output. */
369 print_objfile_section_info (bfd
*abfd
,
370 struct obj_section
*asect
,
371 maint_print_section_data
*print_data
)
373 flagword flags
= bfd_section_flags (asect
->the_bfd_section
);
374 const char *name
= bfd_section_name (asect
->the_bfd_section
);
375 const char *string
= print_data
->arg
;
377 if (string
== NULL
|| *string
== '\0'
378 || match_substring (string
, name
)
379 || match_bfd_flags (string
, flags
))
381 struct gdbarch
*gdbarch
= gdbarch_from_bfd (abfd
);
382 int addr_size
= gdbarch_addr_bit (gdbarch
) / 8;
384 print_section_index (abfd
, asect
->the_bfd_section
,
385 print_data
->index_digits
);
386 maint_print_section_info (name
, flags
,
387 obj_section_addr (asect
),
388 obj_section_endaddr (asect
),
389 asect
->the_bfd_section
->filepos
,
394 /* Find an obj_section, GDB's wrapper around a bfd section for ASECTION
395 from ABFD. It might be that no such wrapper exists (for example debug
396 sections don't have such wrappers) in which case nullptr is returned. */
399 maint_obj_section_from_bfd_section (bfd
*abfd
,
403 if (ofile
->sections
== nullptr)
407 = &ofile
->sections
[gdb_bfd_section_index (abfd
, asection
)];
409 if (osect
>= ofile
->sections_end
)
415 /* Print information about ASECT from ABFD. DATUM holds a pointer to a
416 maint_print_section_data object. Where possible the information for
417 ASECT will print the relocated addresses of the section. */
420 print_bfd_section_info_maybe_relocated (bfd
*abfd
,
424 maint_print_section_data
*print_data
= (maint_print_section_data
*) datum
;
425 objfile
*objfile
= print_data
->objfile
;
427 gdb_assert (objfile
->sections
!= NULL
);
429 = maint_obj_section_from_bfd_section (abfd
, asect
, objfile
);
431 if (osect
->the_bfd_section
== NULL
)
432 print_bfd_section_info (abfd
, asect
, datum
);
434 print_objfile_section_info (abfd
, osect
, print_data
);
437 /* Implement the "maintenance info sections" command. */
440 maintenance_info_sections (const char *arg
, int from_tty
)
446 printf_filtered (_("Exec file:\n"));
447 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd
));
449 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd
));
451 /* Only this function cares about the 'ALLOBJ' argument;
452 if 'ALLOBJ' is the only argument, discard it rather than
453 passing it down to print_objfile_section_info (which
454 wouldn't know how to handle it). */
455 if (arg
&& strcmp (arg
, "ALLOBJ") == 0)
461 for (objfile
*ofile
: current_program_space
->objfiles ())
464 printf_filtered (_(" Object file: %s\n"),
465 bfd_get_filename (ofile
->obfd
));
466 else if (ofile
->obfd
!= exec_bfd
)
469 maint_print_section_data
print_data (ofile
, arg
, ofile
->obfd
);
471 bfd_map_over_sections (ofile
->obfd
,
472 print_bfd_section_info_maybe_relocated
,
473 (void *) &print_data
);
479 maint_print_section_data
print_data (nullptr, arg
, core_bfd
);
481 printf_filtered (_("Core file:\n"));
482 printf_filtered (" `%s', ", bfd_get_filename (core_bfd
));
484 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd
));
485 bfd_map_over_sections (core_bfd
, print_bfd_section_info
,
486 (void *) &print_data
);
491 maintenance_print_statistics (const char *args
, int from_tty
)
493 print_objfile_statistics ();
494 print_symbol_bcache_statistics ();
498 maintenance_print_architecture (const char *args
, int from_tty
)
500 struct gdbarch
*gdbarch
= get_current_arch ();
503 gdbarch_dump (gdbarch
, gdb_stdout
);
508 if (!file
.open (args
, "w"))
509 perror_with_name (_("maintenance print architecture"));
510 gdbarch_dump (gdbarch
, &file
);
514 /* The "maintenance print" command is defined as a prefix, with
515 allow_unknown 0. Therefore, its own definition is called only for
516 "maintenance print" with no args. */
519 maintenance_print_command (const char *arg
, int from_tty
)
521 printf_unfiltered (_("\"maintenance print\" must be followed "
522 "by the name of a print command.\n"));
523 help_list (maintenanceprintlist
, "maintenance print ", all_commands
,
527 /* The "maintenance translate-address" command converts a section and address
528 to a symbol. This can be called in two ways:
529 maintenance translate-address <secname> <addr>
530 or maintenance translate-address <addr>. */
533 maintenance_translate_address (const char *arg
, int from_tty
)
536 struct obj_section
*sect
;
538 struct bound_minimal_symbol sym
;
540 if (arg
== NULL
|| *arg
== 0)
541 error (_("requires argument (address or section + address)"));
547 { /* See if we have a valid section name. */
548 while (*p
&& !isspace (*p
)) /* Find end of section name. */
550 if (*p
== '\000') /* End of command? */
551 error (_("Need to specify section name and address"));
553 int arg_len
= p
- arg
;
554 p
= skip_spaces (p
+ 1);
556 for (objfile
*objfile
: current_program_space
->objfiles ())
557 ALL_OBJFILE_OSECTIONS (objfile
, sect
)
559 if (strncmp (sect
->the_bfd_section
->name
, arg
, arg_len
) == 0)
563 error (_("Unknown section %s."), arg
);
567 address
= parse_and_eval_address (p
);
570 sym
= lookup_minimal_symbol_by_pc_section (address
, sect
);
572 sym
= lookup_minimal_symbol_by_pc (address
);
576 const char *symbol_name
= sym
.minsym
->print_name ();
577 const char *symbol_offset
578 = pulongest (address
- BMSYMBOL_VALUE_ADDRESS (sym
));
580 sect
= MSYMBOL_OBJ_SECTION(sym
.objfile
, sym
.minsym
);
583 const char *section_name
;
584 const char *obj_name
;
586 gdb_assert (sect
->the_bfd_section
&& sect
->the_bfd_section
->name
);
587 section_name
= sect
->the_bfd_section
->name
;
589 gdb_assert (sect
->objfile
&& objfile_name (sect
->objfile
));
590 obj_name
= objfile_name (sect
->objfile
);
592 if (current_program_space
->multi_objfile_p ())
593 printf_filtered (_("%s + %s in section %s of %s\n"),
594 symbol_name
, symbol_offset
,
595 section_name
, obj_name
);
597 printf_filtered (_("%s + %s in section %s\n"),
598 symbol_name
, symbol_offset
, section_name
);
601 printf_filtered (_("%s + %s\n"), symbol_name
, symbol_offset
);
604 printf_filtered (_("no symbol at %s:%s\n"),
605 sect
->the_bfd_section
->name
, hex_string (address
));
607 printf_filtered (_("no symbol at %s\n"), hex_string (address
));
613 /* When a command is deprecated the user will be warned the first time
614 the command is used. If possible, a replacement will be
618 maintenance_deprecate (const char *args
, int from_tty
)
620 if (args
== NULL
|| *args
== '\0')
622 printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\
623 the command you want to deprecate, and optionally the replacement command\n\
624 enclosed in quotes.\n"));
627 maintenance_do_deprecate (args
, 1);
632 maintenance_undeprecate (const char *args
, int from_tty
)
634 if (args
== NULL
|| *args
== '\0')
636 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
637 the command you want to undeprecate.\n"));
640 maintenance_do_deprecate (args
, 0);
643 /* You really shouldn't be using this. It is just for the testsuite.
644 Rather, you should use deprecate_cmd() when the command is created
645 in _initialize_blah().
647 This function deprecates a command and optionally assigns it a
651 maintenance_do_deprecate (const char *text
, int deprecate
)
653 struct cmd_list_element
*alias
= NULL
;
654 struct cmd_list_element
*prefix_cmd
= NULL
;
655 struct cmd_list_element
*cmd
= NULL
;
657 const char *start_ptr
= NULL
;
658 const char *end_ptr
= NULL
;
660 char *replacement
= NULL
;
665 if (!lookup_cmd_composition (text
, &alias
, &prefix_cmd
, &cmd
))
667 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text
);
673 /* Look for a replacement command. */
674 start_ptr
= strchr (text
, '\"');
675 if (start_ptr
!= NULL
)
678 end_ptr
= strrchr (start_ptr
, '\"');
681 len
= end_ptr
- start_ptr
;
682 replacement
= savestring (start_ptr
, len
);
687 if (!start_ptr
|| !end_ptr
)
691 /* If they used an alias, we only want to deprecate the alias.
693 Note the MALLOCED_REPLACEMENT test. If the command's replacement
694 string was allocated at compile time we don't want to free the
698 if (alias
->malloced_replacement
)
699 xfree ((char *) alias
->replacement
);
703 alias
->deprecated_warn_user
= 1;
704 alias
->cmd_deprecated
= 1;
708 alias
->deprecated_warn_user
= 0;
709 alias
->cmd_deprecated
= 0;
711 alias
->replacement
= replacement
;
712 alias
->malloced_replacement
= 1;
717 if (cmd
->malloced_replacement
)
718 xfree ((char *) cmd
->replacement
);
722 cmd
->deprecated_warn_user
= 1;
723 cmd
->cmd_deprecated
= 1;
727 cmd
->deprecated_warn_user
= 0;
728 cmd
->cmd_deprecated
= 0;
730 cmd
->replacement
= replacement
;
731 cmd
->malloced_replacement
= 1;
737 /* Maintenance set/show framework. */
739 struct cmd_list_element
*maintenance_set_cmdlist
;
740 struct cmd_list_element
*maintenance_show_cmdlist
;
743 maintenance_set_cmd (const char *args
, int from_tty
)
745 printf_unfiltered (_("\"maintenance set\" must be followed "
746 "by the name of a set command.\n"));
747 help_list (maintenance_set_cmdlist
, "maintenance set ", all_commands
,
752 maintenance_show_cmd (const char *args
, int from_tty
)
754 cmd_show_list (maintenance_show_cmdlist
, from_tty
, "");
757 /* "maintenance with" command. */
760 maintenance_with_cmd (const char *args
, int from_tty
)
762 with_command_1 ("maintenance set ", maintenance_set_cmdlist
, args
, from_tty
);
765 /* "maintenance with" command completer. */
768 maintenance_with_cmd_completer (struct cmd_list_element
*ignore
,
769 completion_tracker
&tracker
,
770 const char *text
, const char * /*word*/)
772 with_command_completer_1 ("maintenance set ", tracker
, text
);
775 /* Profiling support. */
777 static bool maintenance_profile_p
;
779 show_maintenance_profile_p (struct ui_file
*file
, int from_tty
,
780 struct cmd_list_element
*c
, const char *value
)
782 fprintf_filtered (file
, _("Internal profiling is %s.\n"), value
);
787 #define TEXTEND &_etext
788 #elif defined (HAVE_ETEXT)
790 #define TEXTEND &etext
793 #if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
795 static int profiling_state
;
797 EXTERN_C
void _mcleanup (void);
800 mcleanup_wrapper (void)
806 EXTERN_C
void monstartup (unsigned long, unsigned long);
810 maintenance_set_profile_cmd (const char *args
, int from_tty
,
811 struct cmd_list_element
*c
)
813 if (maintenance_profile_p
== profiling_state
)
816 profiling_state
= maintenance_profile_p
;
818 if (maintenance_profile_p
)
820 static int profiling_initialized
;
822 if (!profiling_initialized
)
824 atexit (mcleanup_wrapper
);
825 profiling_initialized
= 1;
828 /* "main" is now always the first function in the text segment, so use
829 its address for monstartup. */
830 monstartup ((unsigned long) &main
, (unsigned long) TEXTEND
);
834 extern void _mcleanup (void);
841 maintenance_set_profile_cmd (const char *args
, int from_tty
,
842 struct cmd_list_element
*c
)
844 error (_("Profiling support is not available on this system."));
848 static int n_worker_threads
= -1;
850 /* Update the thread pool for the desired number of threads. */
852 update_thread_pool_size ()
855 int n_threads
= n_worker_threads
;
858 n_threads
= std::thread::hardware_concurrency ();
860 gdb::thread_pool::g_thread_pool
->set_thread_count (n_threads
);
865 maintenance_set_worker_threads (const char *args
, int from_tty
,
866 struct cmd_list_element
*c
)
868 update_thread_pool_size ();
872 /* If true, display time usage both at startup and for each command. */
874 static bool per_command_time
;
876 /* If true, display space usage both at startup and for each command. */
878 static bool per_command_space
;
880 /* If true, display basic symtab stats for each command. */
882 static bool per_command_symtab
;
884 /* mt per-command commands. */
886 static struct cmd_list_element
*per_command_setlist
;
887 static struct cmd_list_element
*per_command_showlist
;
889 /* Set whether to display time statistics to NEW_VALUE
890 (non-zero means true). */
893 set_per_command_time (int new_value
)
895 per_command_time
= new_value
;
898 /* Set whether to display space statistics to NEW_VALUE
899 (non-zero means true). */
902 set_per_command_space (int new_value
)
904 per_command_space
= new_value
;
907 /* Count the number of symtabs and blocks. */
910 count_symtabs_and_blocks (int *nr_symtabs_ptr
, int *nr_compunit_symtabs_ptr
,
914 int nr_compunit_symtabs
= 0;
917 /* When collecting statistics during startup, this is called before
918 pretty much anything in gdb has been initialized, and thus
919 current_program_space may be NULL. */
920 if (current_program_space
!= NULL
)
922 for (objfile
*o
: current_program_space
->objfiles ())
924 for (compunit_symtab
*cu
: o
->compunits ())
926 ++nr_compunit_symtabs
;
927 nr_blocks
+= BLOCKVECTOR_NBLOCKS (COMPUNIT_BLOCKVECTOR (cu
));
928 nr_symtabs
+= std::distance (compunit_filetabs (cu
).begin (),
929 compunit_filetabs (cu
).end ());
934 *nr_symtabs_ptr
= nr_symtabs
;
935 *nr_compunit_symtabs_ptr
= nr_compunit_symtabs
;
936 *nr_blocks_ptr
= nr_blocks
;
939 /* As indicated by display_time and display_space, report GDB's
940 elapsed time and space usage from the base time and space recorded
943 scoped_command_stats::~scoped_command_stats ()
945 /* Early exit if we're not reporting any stats. It can be expensive to
946 compute the pre-command values so don't collect them at all if we're
947 not reporting stats. Alas this doesn't work in the startup case because
948 we don't know yet whether we will be reporting the stats. For the
949 startup case collect the data anyway (it should be cheap at this point),
950 and leave it to the reporter to decide whether to print them. */
953 && !per_command_space
954 && !per_command_symtab
)
957 if (m_time_enabled
&& per_command_time
)
959 print_time (_("command finished"));
961 using namespace std::chrono
;
963 run_time_clock::duration cmd_time
964 = run_time_clock::now () - m_start_cpu_time
;
966 steady_clock::duration wall_time
967 = steady_clock::now () - m_start_wall_time
;
968 /* Subtract time spend in prompt_for_continue from walltime. */
969 wall_time
-= get_prompt_for_continue_wait_time ();
971 printf_unfiltered (!m_msg_type
972 ? _("Startup time: %.6f (cpu), %.6f (wall)\n")
973 : _("Command execution time: %.6f (cpu), %.6f (wall)\n"),
974 duration
<double> (cmd_time
).count (),
975 duration
<double> (wall_time
).count ());
978 if (m_space_enabled
&& per_command_space
)
980 #ifdef HAVE_USEFUL_SBRK
981 char *lim
= (char *) sbrk (0);
983 long space_now
= lim
- lim_at_start
;
984 long space_diff
= space_now
- m_start_space
;
986 printf_unfiltered (!m_msg_type
987 ? _("Space used: %ld (%s%ld during startup)\n")
988 : _("Space used: %ld (%s%ld for this command)\n"),
990 (space_diff
>= 0 ? "+" : ""),
995 if (m_symtab_enabled
&& per_command_symtab
)
997 int nr_symtabs
, nr_compunit_symtabs
, nr_blocks
;
999 count_symtabs_and_blocks (&nr_symtabs
, &nr_compunit_symtabs
, &nr_blocks
);
1000 printf_unfiltered (_("#symtabs: %d (+%d),"
1001 " #compunits: %d (+%d),"
1002 " #blocks: %d (+%d)\n"),
1004 nr_symtabs
- m_start_nr_symtabs
,
1005 nr_compunit_symtabs
,
1006 (nr_compunit_symtabs
1007 - m_start_nr_compunit_symtabs
),
1009 nr_blocks
- m_start_nr_blocks
);
1013 scoped_command_stats::scoped_command_stats (bool msg_type
)
1014 : m_msg_type (msg_type
)
1016 if (!m_msg_type
|| per_command_space
)
1018 #ifdef HAVE_USEFUL_SBRK
1019 char *lim
= (char *) sbrk (0);
1020 m_start_space
= lim
- lim_at_start
;
1021 m_space_enabled
= 1;
1025 m_space_enabled
= 0;
1027 if (msg_type
== 0 || per_command_time
)
1029 using namespace std::chrono
;
1031 m_start_cpu_time
= run_time_clock::now ();
1032 m_start_wall_time
= steady_clock::now ();
1035 if (per_command_time
)
1036 print_time (_("command started"));
1041 if (msg_type
== 0 || per_command_symtab
)
1043 int nr_symtabs
, nr_compunit_symtabs
, nr_blocks
;
1045 count_symtabs_and_blocks (&nr_symtabs
, &nr_compunit_symtabs
, &nr_blocks
);
1046 m_start_nr_symtabs
= nr_symtabs
;
1047 m_start_nr_compunit_symtabs
= nr_compunit_symtabs
;
1048 m_start_nr_blocks
= nr_blocks
;
1049 m_symtab_enabled
= 1;
1052 m_symtab_enabled
= 0;
1054 /* Initialize timer to keep track of how long we waited for the user. */
1055 reset_prompt_for_continue_wait_time ();
1061 scoped_command_stats::print_time (const char *msg
)
1063 using namespace std::chrono
;
1065 auto now
= system_clock::now ();
1066 auto ticks
= now
.time_since_epoch ().count () / (1000 * 1000);
1067 auto millis
= ticks
% 1000;
1069 std::time_t as_time
= system_clock::to_time_t (now
);
1071 localtime_r (&as_time
, &tm
);
1074 strftime (out
, sizeof (out
), "%F %H:%M:%S", &tm
);
1076 printf_unfiltered ("%s.%03d - %s\n", out
, (int) millis
, msg
);
1079 /* Handle unknown "mt set per-command" arguments.
1080 In this case have "mt set per-command on|off" affect every setting. */
1083 set_per_command_cmd (const char *args
, int from_tty
)
1085 struct cmd_list_element
*list
;
1088 val
= parse_cli_boolean_value (args
);
1090 error (_("Bad value for 'mt set per-command no'."));
1092 for (list
= per_command_setlist
; list
!= NULL
; list
= list
->next
)
1093 if (list
->var_type
== var_boolean
)
1095 gdb_assert (list
->type
== set_cmd
);
1096 do_set_command (args
, from_tty
, list
);
1100 /* Command "show per-command" displays summary of all the current
1101 "show per-command " settings. */
1104 show_per_command_cmd (const char *args
, int from_tty
)
1106 cmd_show_list (per_command_showlist
, from_tty
, "");
1110 /* The "maintenance selftest" command. */
1113 maintenance_selftest (const char *args
, int from_tty
)
1116 selftests::run_tests (args
);
1118 printf_filtered (_("\
1119 Selftests have been disabled for this build.\n"));
1124 maintenance_info_selftests (const char *arg
, int from_tty
)
1127 printf_filtered ("Registered selftests:\n");
1128 selftests::for_each_selftest ([] (const std::string
&name
) {
1129 printf_filtered (" - %s\n", name
.c_str ());
1132 printf_filtered (_("\
1133 Selftests have been disabled for this build.\n"));
1139 _initialize_maint_cmds (void)
1141 struct cmd_list_element
*cmd
;
1143 add_prefix_cmd ("maintenance", class_maintenance
, maintenance_command
, _("\
1144 Commands for use by GDB maintainers.\n\
1145 Includes commands to dump specific internal GDB structures in\n\
1146 a human readable form, to cause GDB to deliberately dump core, etc."),
1147 &maintenancelist
, "maintenance ", 0,
1150 add_com_alias ("mt", "maintenance", class_maintenance
, 1);
1152 add_prefix_cmd ("info", class_maintenance
, maintenance_info_command
, _("\
1153 Commands for showing internal info about the program being debugged."),
1154 &maintenanceinfolist
, "maintenance info ", 0,
1156 add_alias_cmd ("i", "info", class_maintenance
, 1, &maintenancelist
);
1158 add_cmd ("sections", class_maintenance
, maintenance_info_sections
, _("\
1159 List the BFD sections of the exec and core files.\n\
1160 Arguments may be any combination of:\n\
1161 [one or more section names]\n\
1162 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
1163 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
1164 Sections matching any argument will be listed (no argument\n\
1165 implies all sections). In addition, the special argument\n\
1167 lists all sections from all object files, including shared libraries."),
1168 &maintenanceinfolist
);
1170 add_prefix_cmd ("print", class_maintenance
, maintenance_print_command
,
1171 _("Maintenance command for printing GDB internal state."),
1172 &maintenanceprintlist
, "maintenance print ", 0,
1175 add_prefix_cmd ("set", class_maintenance
, maintenance_set_cmd
, _("\
1176 Set GDB internal variables used by the GDB maintainer.\n\
1177 Configure variables internal to GDB that aid in GDB's maintenance"),
1178 &maintenance_set_cmdlist
, "maintenance set ",
1182 add_prefix_cmd ("show", class_maintenance
, maintenance_show_cmd
, _("\
1183 Show GDB internal variables used by the GDB maintainer.\n\
1184 Configure variables internal to GDB that aid in GDB's maintenance"),
1185 &maintenance_show_cmdlist
, "maintenance show ",
1189 cmd
= add_cmd ("with", class_maintenance
, maintenance_with_cmd
, _("\
1190 Like \"with\", but works with \"maintenance set\" variables.\n\
1191 Usage: maintenance with SETTING [VALUE] [-- COMMAND]\n\
1192 With no COMMAND, repeats the last executed command.\n\
1193 SETTING is any setting you can change with the \"maintenance set\"\n\
1196 set_cmd_completer_handle_brkchars (cmd
, maintenance_with_cmd_completer
);
1199 add_cmd ("dump-me", class_maintenance
, maintenance_dump_me
, _("\
1200 Get fatal error; make debugger dump its core.\n\
1201 GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1202 itself a SIGQUIT signal."),
1206 add_cmd ("internal-error", class_maintenance
,
1207 maintenance_internal_error
, _("\
1208 Give GDB an internal error.\n\
1209 Cause GDB to behave as if an internal error was detected."),
1212 add_cmd ("internal-warning", class_maintenance
,
1213 maintenance_internal_warning
, _("\
1214 Give GDB an internal warning.\n\
1215 Cause GDB to behave as if an internal warning was reported."),
1218 add_cmd ("demangler-warning", class_maintenance
,
1219 maintenance_demangler_warning
, _("\
1220 Give GDB a demangler warning.\n\
1221 Cause GDB to behave as if a demangler warning was reported."),
1224 cmd
= add_cmd ("demangle", class_maintenance
, maintenance_demangle
, _("\
1225 This command has been moved to \"demangle\"."),
1227 deprecate_cmd (cmd
, "demangle");
1229 add_prefix_cmd ("per-command", class_maintenance
, set_per_command_cmd
, _("\
1230 Per-command statistics settings."),
1231 &per_command_setlist
, "maintenance set per-command ",
1232 1/*allow-unknown*/, &maintenance_set_cmdlist
);
1234 add_prefix_cmd ("per-command", class_maintenance
, show_per_command_cmd
, _("\
1235 Show per-command statistics settings."),
1236 &per_command_showlist
, "maintenance show per-command ",
1237 0/*allow-unknown*/, &maintenance_show_cmdlist
);
1239 add_setshow_boolean_cmd ("time", class_maintenance
,
1240 &per_command_time
, _("\
1241 Set whether to display per-command execution time."), _("\
1242 Show whether to display per-command execution time."),
1244 If enabled, the execution time for each command will be\n\
1245 displayed following the command's output."),
1247 &per_command_setlist
, &per_command_showlist
);
1249 add_setshow_boolean_cmd ("space", class_maintenance
,
1250 &per_command_space
, _("\
1251 Set whether to display per-command space usage."), _("\
1252 Show whether to display per-command space usage."),
1254 If enabled, the space usage for each command will be\n\
1255 displayed following the command's output."),
1257 &per_command_setlist
, &per_command_showlist
);
1259 add_setshow_boolean_cmd ("symtab", class_maintenance
,
1260 &per_command_symtab
, _("\
1261 Set whether to display per-command symtab statistics."), _("\
1262 Show whether to display per-command symtab statistics."),
1264 If enabled, the basic symtab statistics for each command will be\n\
1265 displayed following the command's output."),
1267 &per_command_setlist
, &per_command_showlist
);
1269 /* This is equivalent to "mt set per-command time on".
1270 Kept because some people are used to typing "mt time 1". */
1271 add_cmd ("time", class_maintenance
, maintenance_time_display
, _("\
1272 Set the display of time usage.\n\
1273 If nonzero, will cause the execution time for each command to be\n\
1274 displayed, following the command's output."),
1277 /* This is equivalent to "mt set per-command space on".
1278 Kept because some people are used to typing "mt space 1". */
1279 add_cmd ("space", class_maintenance
, maintenance_space_display
, _("\
1280 Set the display of space usage.\n\
1281 If nonzero, will cause the execution space for each command to be\n\
1282 displayed, following the command's output."),
1285 add_cmd ("type", class_maintenance
, maintenance_print_type
, _("\
1286 Print a type chain for a given symbol.\n\
1287 For each node in a type chain, print the raw data for each member of\n\
1288 the type structure, and the interpretation of the data."),
1289 &maintenanceprintlist
);
1291 add_cmd ("statistics", class_maintenance
, maintenance_print_statistics
,
1292 _("Print statistics about internal gdb state."),
1293 &maintenanceprintlist
);
1295 add_cmd ("architecture", class_maintenance
,
1296 maintenance_print_architecture
, _("\
1297 Print the internal architecture configuration.\n\
1298 Takes an optional file parameter."),
1299 &maintenanceprintlist
);
1301 add_prefix_cmd ("check", class_maintenance
, maintenance_check_command
, _("\
1302 Commands for checking internal gdb state."),
1303 &maintenancechecklist
, "maintenance check ", 0,
1306 add_cmd ("translate-address", class_maintenance
,
1307 maintenance_translate_address
,
1308 _("Translate a section name and address to a symbol."),
1311 add_cmd ("deprecate", class_maintenance
, maintenance_deprecate
, _("\
1312 Deprecate a command (for testing purposes).\n\
1313 Usage: maintenance deprecate COMMANDNAME [\"REPLACEMENT\"]\n\
1314 This is used by the testsuite to check the command deprecator.\n\
1315 You probably shouldn't use this,\n\
1316 rather you should use the C function deprecate_cmd()."), &maintenancelist
);
1318 add_cmd ("undeprecate", class_maintenance
, maintenance_undeprecate
, _("\
1319 Undeprecate a command (for testing purposes).\n\
1320 Usage: maintenance undeprecate COMMANDNAME\n\
1321 This is used by the testsuite to check the command deprecator.\n\
1322 You probably shouldn't use this."),
1325 add_cmd ("selftest", class_maintenance
, maintenance_selftest
, _("\
1326 Run gdb's unit tests.\n\
1327 Usage: maintenance selftest [FILTER]\n\
1328 This will run any unit tests that were built in to gdb.\n\
1329 If a filter is given, only the tests with that value in their name will ran."),
1332 add_cmd ("selftests", class_maintenance
, maintenance_info_selftests
,
1333 _("List the registered selftests."), &maintenanceinfolist
);
1335 add_setshow_boolean_cmd ("profile", class_maintenance
,
1336 &maintenance_profile_p
, _("\
1337 Set internal profiling."), _("\
1338 Show internal profiling."), _("\
1339 When enabled GDB is profiled."),
1340 maintenance_set_profile_cmd
,
1341 show_maintenance_profile_p
,
1342 &maintenance_set_cmdlist
,
1343 &maintenance_show_cmdlist
);
1345 add_setshow_zuinteger_unlimited_cmd ("worker-threads",
1347 &n_worker_threads
, _("\
1348 Set the number of worker threads GDB can use."), _("\
1349 Show the number of worker threads GDB can use."), _("\
1350 GDB may use multiple threads to speed up certain CPU-intensive operations,\n\
1351 such as demangling symbol names."),
1352 maintenance_set_worker_threads
, NULL
,
1353 &maintenance_set_cmdlist
,
1354 &maintenance_show_cmdlist
);
1356 update_thread_pool_size ();