1 /* Support for GDB maintenance commands.
3 Copyright (C) 1992-2024 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/>. */
23 #include "arch-utils.h"
33 #include "expression.h"
40 #include "gdbsupport/selftest.h"
42 #include "gdbsupport/thread-pool.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"
49 static void maintenance_do_deprecate (const char *, int);
53 maintenance_dump_me (const char *args
, int from_tty
)
55 if (query (_("Should GDB dump core? ")))
58 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
59 signal (SIGABRT
, SIG_DFL
);
60 kill (getpid (), SIGABRT
);
62 signal (SIGQUIT
, SIG_DFL
);
63 kill (getpid (), SIGQUIT
);
69 /* Stimulate the internal error mechanism that GDB uses when an
70 internal problem is detected. Allows testing of the mechanism.
71 Also useful when the user wants to drop a core file but not exit
75 maintenance_internal_error (const char *args
, int from_tty
)
77 internal_error ("%s", (args
== NULL
? "" : args
));
80 /* Stimulate the internal error mechanism that GDB uses when an
81 internal problem is detected. Allows testing of the mechanism.
82 Also useful when the user wants to drop a core file but not exit
86 maintenance_internal_warning (const char *args
, int from_tty
)
88 internal_warning ("%s", (args
== NULL
? "" : args
));
91 /* Stimulate the internal error mechanism that GDB uses when an
92 demangler problem is detected. Allows testing of the mechanism. */
95 maintenance_demangler_warning (const char *args
, int from_tty
)
97 demangler_warning (__FILE__
, __LINE__
, "%s", (args
== NULL
? "" : args
));
100 /* Old command to demangle a string. The command has been moved to "demangle".
101 It is kept for now because otherwise "mt demangle" gets interpreted as
102 "mt demangler-warning" which artificially creates an internal gdb error. */
105 maintenance_demangle (const char *args
, int from_tty
)
107 gdb_printf (_("This command has been moved to \"demangle\".\n"));
111 maintenance_time_display (const char *args
, int from_tty
)
113 if (args
== NULL
|| *args
== '\0')
114 gdb_printf (_("\"maintenance time\" takes a numeric argument.\n"));
116 set_per_command_time (strtol (args
, NULL
, 10));
120 maintenance_space_display (const char *args
, int from_tty
)
122 if (args
== NULL
|| *args
== '\0')
123 gdb_printf ("\"maintenance space\" takes a numeric argument.\n");
125 set_per_command_space (strtol (args
, NULL
, 10));
128 /* Mini tokenizing lexer for 'maint info sections' command. */
131 match_substring (const char *string
, const char *substr
)
133 int substr_len
= strlen (substr
);
136 while ((tok
= strstr (string
, substr
)) != NULL
)
138 /* Got a partial match. Is it a whole word? */
143 /* Token is delimited at the front... */
144 if (tok
[substr_len
] == ' '
145 || tok
[substr_len
] == '\t'
146 || tok
[substr_len
] == '\0')
148 /* Token is delimited at the rear. Got a whole-word match. */
152 /* Token didn't match as a whole word. Advance and try again. */
158 /* Structure holding information about a single bfd section flag. This is
159 used by the "maintenance info sections" command to print the sections,
160 and for filtering which sections are printed. */
162 struct single_bfd_flag_info
164 /* The name of the section. This is what is printed for the flag, and
165 what the user enter in order to filter by flag. */
168 /* The bfd defined SEC_* flagword value for this flag. */
172 /* Vector of all the known bfd flags. */
174 static const single_bfd_flag_info bfd_flag_info
[] =
176 { "ALLOC", SEC_ALLOC
},
177 { "LOAD", SEC_LOAD
},
178 { "RELOC", SEC_RELOC
},
179 { "READONLY", SEC_READONLY
},
180 { "CODE", SEC_CODE
},
181 { "DATA", SEC_DATA
},
183 { "CONSTRUCTOR", SEC_CONSTRUCTOR
},
184 { "HAS_CONTENTS", SEC_HAS_CONTENTS
},
185 { "NEVER_LOAD", SEC_NEVER_LOAD
},
186 { "COFF_SHARED_LIBRARY", SEC_COFF_SHARED_LIBRARY
},
187 { "IS_COMMON", SEC_IS_COMMON
}
190 /* For each flag in the global BFD_FLAG_INFO list, if FLAGS has a flag's
191 flagword value set, and STRING contains the flag's name then return
192 true, otherwise return false. STRING is never nullptr. */
195 match_bfd_flags (const char *string
, flagword flags
)
197 gdb_assert (string
!= nullptr);
199 for (const auto &f
: bfd_flag_info
)
202 && match_substring (string
, f
.name
))
209 /* Print the names of all flags set in FLAGS. The names are taken from the
210 BFD_FLAG_INFO global. */
213 print_bfd_flags (flagword flags
)
215 for (const auto &f
: bfd_flag_info
)
218 gdb_printf (" %s", f
.name
);
223 maint_print_section_info (const char *name
, flagword flags
,
224 CORE_ADDR addr
, CORE_ADDR endaddr
,
225 unsigned long filepos
, int addr_size
)
227 gdb_printf (" %s", hex_string_custom (addr
, addr_size
));
228 gdb_printf ("->%s", hex_string_custom (endaddr
, addr_size
));
229 gdb_printf (" at %s",
230 hex_string_custom ((unsigned long) filepos
, 8));
231 gdb_printf (": %s", name
);
232 print_bfd_flags (flags
);
236 /* Return the number of digits required to display COUNT in decimal.
238 Used when pretty printing index numbers to ensure all of the indexes line
242 index_digits (int count
)
244 return ((int) log10 ((float) count
)) + 1;
247 /* Helper function to pretty-print the section index of ASECT from ABFD.
248 The INDEX_DIGITS is the number of digits in the largest index that will
249 be printed, and is used to pretty-print the resulting string. */
252 print_section_index (bfd
*abfd
,
257 = string_printf (" [%d] ", gdb_bfd_section_index (abfd
, asect
));
258 /* The '+ 4' for the leading and trailing characters. */
259 gdb_printf ("%-*s", (index_digits
+ 4), result
.c_str ());
262 /* Print information about ASECT from ABFD. The section will be printed using
263 the VMA's from the bfd, which will not be the relocated addresses for bfds
264 that should be relocated. The information must be printed with the same
265 layout as PRINT_OBJFILE_SECTION_INFO below.
267 ARG is the argument string passed by the user to the top level maintenance
268 info sections command. Used for filtering which sections are printed. */
271 print_bfd_section_info (bfd
*abfd
, asection
*asect
, const char *arg
,
274 flagword flags
= bfd_section_flags (asect
);
275 const char *name
= bfd_section_name (asect
);
277 if (arg
== NULL
|| *arg
== '\0'
278 || match_substring (arg
, name
)
279 || match_bfd_flags (arg
, flags
))
281 struct gdbarch
*gdbarch
= gdbarch_from_bfd (abfd
);
282 int addr_size
= gdbarch_addr_bit (gdbarch
) / 8;
283 CORE_ADDR addr
, endaddr
;
285 addr
= bfd_section_vma (asect
);
286 endaddr
= addr
+ bfd_section_size (asect
);
287 print_section_index (abfd
, asect
, index_digits
);
288 maint_print_section_info (name
, flags
, addr
, endaddr
,
289 asect
->filepos
, addr_size
);
293 /* Print information about ASECT which is GDB's wrapper around a section
294 from ABFD. The information must be printed with the same layout as
295 PRINT_BFD_SECTION_INFO above. PRINT_DATA holds information used to
296 filter which sections are printed, and for formatting the output.
298 ARG is the argument string passed by the user to the top level maintenance
299 info sections command. Used for filtering which sections are printed. */
302 print_objfile_section_info (bfd
*abfd
, struct obj_section
*asect
,
303 const char *arg
, int index_digits
)
305 flagword flags
= bfd_section_flags (asect
->the_bfd_section
);
306 const char *name
= bfd_section_name (asect
->the_bfd_section
);
308 if (arg
== NULL
|| *arg
== '\0'
309 || match_substring (arg
, name
)
310 || match_bfd_flags (arg
, flags
))
312 struct gdbarch
*gdbarch
= gdbarch_from_bfd (abfd
);
313 int addr_size
= gdbarch_addr_bit (gdbarch
) / 8;
315 print_section_index (abfd
, asect
->the_bfd_section
, index_digits
);
316 maint_print_section_info (name
, flags
,
317 asect
->addr (), asect
->endaddr (),
318 asect
->the_bfd_section
->filepos
,
323 /* Find an obj_section, GDB's wrapper around a bfd section for ASECTION
324 from ABFD. It might be that no such wrapper exists (for example debug
325 sections don't have such wrappers) in which case nullptr is returned. */
328 maint_obj_section_from_bfd_section (bfd
*abfd
,
332 if (ofile
->sections_start
== nullptr)
336 = &ofile
->sections_start
[gdb_bfd_section_index (abfd
, asection
)];
338 if (osect
>= ofile
->sections_end
)
344 /* Print information about all sections from ABFD, which is the bfd
345 corresponding to OBJFILE. It is fine for OBJFILE to be nullptr, but
346 ABFD must never be nullptr. If OBJFILE is provided then the sections of
347 ABFD will (potentially) be displayed relocated (i.e. the object file was
348 loaded with add-symbol-file and custom offsets were provided).
350 HEADER is a string that describes this file, e.g. 'Exec file: ', or
353 ARG is a string used for filtering which sections are printed, this can
354 be nullptr for no filtering. See the top level 'maint info sections'
355 for a fuller description of the possible filtering strings. */
358 maint_print_all_sections (const char *header
, bfd
*abfd
, objfile
*objfile
,
362 gdb_stdout
->wrap_here (8);
363 gdb_printf ("`%s', ", bfd_get_filename (abfd
));
364 gdb_stdout
->wrap_here (8);
365 gdb_printf (_("file type %s.\n"), bfd_get_target (abfd
));
367 int section_count
= gdb_bfd_count_sections (abfd
);
368 int digits
= index_digits (section_count
);
370 for (asection
*sect
: gdb_bfd_sections (abfd
))
372 obj_section
*osect
= nullptr;
374 if (objfile
!= nullptr)
376 gdb_assert (objfile
->sections_start
!= nullptr);
378 = maint_obj_section_from_bfd_section (abfd
, sect
, objfile
);
379 if (osect
->the_bfd_section
== nullptr)
383 if (osect
== nullptr)
384 print_bfd_section_info (abfd
, sect
, arg
, digits
);
386 print_objfile_section_info (abfd
, osect
, arg
, digits
);
390 /* The options for the "maintenance info sections" command. */
392 struct maint_info_sections_opts
394 /* For "-all-objects". */
395 bool all_objects
= false;
398 static const gdb::option::option_def maint_info_sections_option_defs
[] = {
400 gdb::option::flag_option_def
<maint_info_sections_opts
> {
402 [] (maint_info_sections_opts
*opts
) { return &opts
->all_objects
; },
403 N_("Display information from all loaded object files."),
407 /* Create an option_def_group for the "maintenance info sections" options,
408 with CC_OPTS as context. */
410 static inline gdb::option::option_def_group
411 make_maint_info_sections_options_def_group (maint_info_sections_opts
*cc_opts
)
413 return {{maint_info_sections_option_defs
}, cc_opts
};
416 /* Completion for the "maintenance info sections" command. */
419 maint_info_sections_completer (struct cmd_list_element
*cmd
,
420 completion_tracker
&tracker
,
421 const char *text
, const char * /* word */)
423 /* Complete command options. */
424 const auto group
= make_maint_info_sections_options_def_group (nullptr);
425 if (gdb::option::complete_options
426 (tracker
, &text
, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR
, group
))
428 const char *word
= advance_to_expression_complete_word_point (tracker
, text
);
430 /* Offer completion for section flags, but not section names. This is
431 only a maintenance command after all, no point going over the top. */
432 std::vector
<const char *> flags
;
433 for (const auto &f
: bfd_flag_info
)
434 flags
.push_back (f
.name
);
435 flags
.push_back (nullptr);
436 complete_on_enum (tracker
, flags
.data (), text
, word
);
439 /* Implement the "maintenance info sections" command. */
442 maintenance_info_sections (const char *arg
, int from_tty
)
444 /* Check if the "-all-objects" flag was passed. */
445 maint_info_sections_opts opts
;
446 const auto group
= make_maint_info_sections_options_def_group (&opts
);
447 gdb::option::process_options
448 (&arg
, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR
, group
);
450 for (objfile
*ofile
: current_program_space
->objfiles ())
452 if (ofile
->obfd
== current_program_space
->exec_bfd ())
453 maint_print_all_sections (_("Exec file: "), ofile
->obfd
.get (),
455 else if (opts
.all_objects
)
456 maint_print_all_sections (_("Object file: "), ofile
->obfd
.get (),
460 if (current_program_space
->core_bfd () != nullptr)
461 maint_print_all_sections (_("Core file: "),
462 current_program_space
->core_bfd (), nullptr, arg
);
465 /* Implement the "maintenance info target-sections" command. */
468 maintenance_info_target_sections (const char *arg
, int from_tty
)
472 const std::vector
<target_section
> *table
473 = target_get_section_table (current_inferior ()->top_target ());
474 if (table
== nullptr)
477 for (const target_section
&sec
: *table
)
479 if (abfd
== nullptr || sec
.the_bfd_section
->owner
!= abfd
)
481 abfd
= sec
.the_bfd_section
->owner
;
482 digits
= std::max (index_digits (gdb_bfd_count_sections (abfd
)),
487 struct gdbarch
*gdbarch
= nullptr;
490 for (const target_section
&sec
: *table
)
492 if (sec
.the_bfd_section
->owner
!= abfd
)
494 abfd
= sec
.the_bfd_section
->owner
;
495 gdbarch
= gdbarch_from_bfd (abfd
);
496 addr_size
= gdbarch_addr_bit (gdbarch
) / 8;
498 gdb_printf (_("From '%s', file type %s:\n"),
499 bfd_get_filename (abfd
), bfd_get_target (abfd
));
501 print_bfd_section_info (abfd
,
505 /* The magic '8 + digits' here ensures that the 'Start' is aligned
506 with the output of print_bfd_section_info. */
507 gdb_printf ("%*sStart: %s, End: %s, Owner token: %p\n",
509 hex_string_custom (sec
.addr
, addr_size
),
510 hex_string_custom (sec
.endaddr
, addr_size
),
516 maintenance_print_statistics (const char *args
, int from_tty
)
518 print_objfile_statistics ();
522 maintenance_print_architecture (const char *args
, int from_tty
)
524 struct gdbarch
*gdbarch
= get_current_arch ();
527 gdbarch_dump (gdbarch
, gdb_stdout
);
532 if (!file
.open (args
, "w"))
533 perror_with_name (_("maintenance print architecture"));
534 gdbarch_dump (gdbarch
, &file
);
538 /* The "maintenance translate-address" command converts a section and address
539 to a symbol. This can be called in two ways:
540 maintenance translate-address <secname> <addr>
541 or maintenance translate-address <addr>. */
544 maintenance_translate_address (const char *arg
, int from_tty
)
547 struct obj_section
*sect
;
550 if (arg
== NULL
|| *arg
== 0)
551 error (_("requires argument (address or section + address)"));
557 { /* See if we have a valid section name. */
558 while (*p
&& !isspace (*p
)) /* Find end of section name. */
560 if (*p
== '\000') /* End of command? */
561 error (_("Need to specify section name and address"));
563 int arg_len
= p
- arg
;
564 p
= skip_spaces (p
+ 1);
566 for (objfile
*objfile
: current_program_space
->objfiles ())
567 for (obj_section
*iter
: objfile
->sections ())
569 if (strncmp (iter
->the_bfd_section
->name
, arg
, arg_len
) == 0)
573 error (_("Unknown section %s."), arg
);
577 address
= parse_and_eval_address (p
);
579 bound_minimal_symbol sym
;
581 sym
= lookup_minimal_symbol_by_pc_section (address
, sect
);
583 sym
= lookup_minimal_symbol_by_pc (address
);
587 const char *symbol_name
= sym
.minsym
->print_name ();
588 const char *symbol_offset
589 = pulongest (address
- sym
.value_address ());
591 sect
= sym
.obj_section ();
594 const char *section_name
;
595 const char *obj_name
;
597 gdb_assert (sect
->the_bfd_section
&& sect
->the_bfd_section
->name
);
598 section_name
= sect
->the_bfd_section
->name
;
600 gdb_assert (sect
->objfile
&& objfile_name (sect
->objfile
));
601 obj_name
= objfile_name (sect
->objfile
);
603 if (current_program_space
->multi_objfile_p ())
604 gdb_printf (_("%s + %s in section %s of %s\n"),
605 symbol_name
, symbol_offset
,
606 section_name
, obj_name
);
608 gdb_printf (_("%s + %s in section %s\n"),
609 symbol_name
, symbol_offset
, section_name
);
612 gdb_printf (_("%s + %s\n"), symbol_name
, symbol_offset
);
615 gdb_printf (_("no symbol at %s:%s\n"),
616 sect
->the_bfd_section
->name
, hex_string (address
));
618 gdb_printf (_("no symbol at %s\n"), hex_string (address
));
624 /* When a command is deprecated the user will be warned the first time
625 the command is used. If possible, a replacement will be
629 maintenance_deprecate (const char *args
, int from_tty
)
631 if (args
== NULL
|| *args
== '\0')
633 gdb_printf (_("\"maintenance deprecate\" takes an argument,\n\
634 the command you want to deprecate, and optionally the replacement command\n\
635 enclosed in quotes.\n"));
638 maintenance_do_deprecate (args
, 1);
643 maintenance_undeprecate (const char *args
, int from_tty
)
645 if (args
== NULL
|| *args
== '\0')
647 gdb_printf (_("\"maintenance undeprecate\" takes an argument, \n\
648 the command you want to undeprecate.\n"));
651 maintenance_do_deprecate (args
, 0);
654 /* You really shouldn't be using this. It is just for the testsuite.
655 Rather, you should use deprecate_cmd() when the command is created
656 in _initialize_blah().
658 This function deprecates a command and optionally assigns it a
662 maintenance_do_deprecate (const char *text
, int deprecate
)
664 struct cmd_list_element
*alias
= NULL
;
665 struct cmd_list_element
*prefix_cmd
= NULL
;
666 struct cmd_list_element
*cmd
= NULL
;
668 const char *start_ptr
= NULL
;
669 const char *end_ptr
= NULL
;
671 char *replacement
= NULL
;
676 if (!lookup_cmd_composition (text
, &alias
, &prefix_cmd
, &cmd
))
678 gdb_printf (_("Can't find command '%s' to deprecate.\n"), text
);
684 /* Look for a replacement command. */
685 start_ptr
= strchr (text
, '\"');
686 if (start_ptr
!= NULL
)
689 end_ptr
= strrchr (start_ptr
, '\"');
692 len
= end_ptr
- start_ptr
;
693 replacement
= savestring (start_ptr
, len
);
698 if (!start_ptr
|| !end_ptr
)
702 /* If they used an alias, we only want to deprecate the alias.
704 Note the MALLOCED_REPLACEMENT test. If the command's replacement
705 string was allocated at compile time we don't want to free the
709 if (alias
->malloced_replacement
)
710 xfree ((char *) alias
->replacement
);
714 alias
->deprecated_warn_user
= 1;
715 alias
->cmd_deprecated
= 1;
719 alias
->deprecated_warn_user
= 0;
720 alias
->cmd_deprecated
= 0;
722 alias
->replacement
= replacement
;
723 alias
->malloced_replacement
= 1;
728 if (cmd
->malloced_replacement
)
729 xfree ((char *) cmd
->replacement
);
733 cmd
->deprecated_warn_user
= 1;
734 cmd
->cmd_deprecated
= 1;
738 cmd
->deprecated_warn_user
= 0;
739 cmd
->cmd_deprecated
= 0;
741 cmd
->replacement
= replacement
;
742 cmd
->malloced_replacement
= 1;
748 /* Maintenance set/show framework. */
750 struct cmd_list_element
*maintenance_set_cmdlist
;
751 struct cmd_list_element
*maintenance_show_cmdlist
;
753 /* "maintenance with" command. */
756 maintenance_with_cmd (const char *args
, int from_tty
)
758 with_command_1 ("maintenance set ", maintenance_set_cmdlist
, args
, from_tty
);
761 /* "maintenance with" command completer. */
764 maintenance_with_cmd_completer (struct cmd_list_element
*ignore
,
765 completion_tracker
&tracker
,
766 const char *text
, const char * /*word*/)
768 with_command_completer_1 ("maintenance set ", tracker
, text
);
771 /* Profiling support. */
773 static bool maintenance_profile_p
;
775 show_maintenance_profile_p (struct ui_file
*file
, int from_tty
,
776 struct cmd_list_element
*c
, const char *value
)
778 gdb_printf (file
, _("Internal profiling is %s.\n"), value
);
783 #define TEXTEND &_etext
784 #elif defined (HAVE_ETEXT)
786 #define TEXTEND &etext
789 #if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
791 static int profiling_state
;
793 extern "C" void _mcleanup (void);
796 mcleanup_wrapper (void)
802 extern "C" void monstartup (unsigned long, unsigned long);
803 extern int main (int, char **);
806 maintenance_set_profile_cmd (const char *args
, int from_tty
,
807 struct cmd_list_element
*c
)
809 if (maintenance_profile_p
== profiling_state
)
812 profiling_state
= maintenance_profile_p
;
814 if (maintenance_profile_p
)
816 static int profiling_initialized
;
818 if (!profiling_initialized
)
820 atexit (mcleanup_wrapper
);
821 profiling_initialized
= 1;
824 /* "main" is now always the first function in the text segment, so use
825 its address for monstartup. */
826 monstartup ((unsigned long) &main
, (unsigned long) TEXTEND
);
830 extern void _mcleanup (void);
837 maintenance_set_profile_cmd (const char *args
, int from_tty
,
838 struct cmd_list_element
*c
)
840 error (_("Profiling support is not available on this system."));
844 static int n_worker_threads
= -1;
849 update_thread_pool_size ()
852 int n_threads
= n_worker_threads
;
856 const int hardware_threads
= std::thread::hardware_concurrency ();
857 /* Testing in PR gdb/29959 indicates that parallel efficiency drops
858 between n_threads=5 to 8. Therefore, use no more than 8 threads
859 to avoid an excessive number of threads in the pool on many-core
861 const int max_thread_count
= 8;
862 n_threads
= std::min (hardware_threads
, max_thread_count
);
865 gdb::thread_pool::g_thread_pool
->set_thread_count (n_threads
);
870 maintenance_set_worker_threads (const char *args
, int from_tty
,
871 struct cmd_list_element
*c
)
873 update_thread_pool_size ();
877 maintenance_show_worker_threads (struct ui_file
*file
, int from_tty
,
878 struct cmd_list_element
*c
,
882 if (n_worker_threads
== -1)
884 gdb_printf (file
, _("The number of worker threads GDB "
885 "can use is the default (currently %zu).\n"),
886 gdb::thread_pool::g_thread_pool
->thread_count ());
891 int report_threads
= 0;
893 report_threads
= n_worker_threads
;
895 gdb_printf (file
, _("The number of worker threads GDB "
901 /* If true, display time usage both at startup and for each command. */
903 static bool per_command_time
;
905 /* If true, display space usage both at startup and for each command. */
907 static bool per_command_space
;
909 /* If true, display basic symtab stats for each command. */
911 static bool per_command_symtab
;
913 /* mt per-command commands. */
915 static struct cmd_list_element
*per_command_setlist
;
916 static struct cmd_list_element
*per_command_showlist
;
918 /* Set whether to display time statistics to NEW_VALUE
919 (non-zero means true). */
922 set_per_command_time (int new_value
)
924 per_command_time
= new_value
;
927 /* Set whether to display space statistics to NEW_VALUE
928 (non-zero means true). */
931 set_per_command_space (int new_value
)
933 per_command_space
= new_value
;
936 /* Count the number of symtabs and blocks. */
939 count_symtabs_and_blocks (int *nr_symtabs_ptr
, int *nr_compunit_symtabs_ptr
,
943 int nr_compunit_symtabs
= 0;
946 /* When collecting statistics during startup, this is called before
947 pretty much anything in gdb has been initialized, and thus
948 current_program_space may be NULL. */
949 if (current_program_space
!= NULL
)
951 for (objfile
*o
: current_program_space
->objfiles ())
953 for (compunit_symtab
*cu
: o
->compunits ())
955 ++nr_compunit_symtabs
;
956 nr_blocks
+= cu
->blockvector ()->num_blocks ();
957 nr_symtabs
+= std::distance (cu
->filetabs ().begin (),
958 cu
->filetabs ().end ());
963 *nr_symtabs_ptr
= nr_symtabs
;
964 *nr_compunit_symtabs_ptr
= nr_compunit_symtabs
;
965 *nr_blocks_ptr
= nr_blocks
;
968 /* As indicated by display_time and display_space, report GDB's
969 elapsed time and space usage from the base time and space recorded
972 scoped_command_stats::~scoped_command_stats ()
974 /* Early exit if we're not reporting any stats. It can be expensive to
975 compute the pre-command values so don't collect them at all if we're
976 not reporting stats. Alas this doesn't work in the startup case because
977 we don't know yet whether we will be reporting the stats. For the
978 startup case collect the data anyway (it should be cheap at this point),
979 and leave it to the reporter to decide whether to print them. */
982 && !per_command_space
983 && !per_command_symtab
)
986 if (m_time_enabled
&& per_command_time
)
988 print_time (_("command finished"));
990 using namespace std::chrono
;
992 run_time_clock::duration cmd_time
993 = run_time_clock::now () - m_start_cpu_time
;
995 steady_clock::duration wall_time
996 = steady_clock::now () - m_start_wall_time
;
997 /* Subtract time spend in prompt_for_continue from walltime. */
998 wall_time
-= get_prompt_for_continue_wait_time ();
1000 gdb_printf (gdb_stdlog
,
1002 ? _("Startup time: %.6f (cpu), %.6f (wall)\n")
1003 : _("Command execution time: %.6f (cpu), %.6f (wall)\n"),
1004 duration
<double> (cmd_time
).count (),
1005 duration
<double> (wall_time
).count ());
1008 if (m_space_enabled
&& per_command_space
)
1010 #ifdef HAVE_USEFUL_SBRK
1011 char *lim
= (char *) sbrk (0);
1013 long space_now
= lim
- lim_at_start
;
1014 long space_diff
= space_now
- m_start_space
;
1016 gdb_printf (gdb_stdlog
,
1018 ? _("Space used: %ld (%s%ld during startup)\n")
1019 : _("Space used: %ld (%s%ld for this command)\n"),
1021 (space_diff
>= 0 ? "+" : ""),
1026 if (m_symtab_enabled
&& per_command_symtab
)
1028 int nr_symtabs
, nr_compunit_symtabs
, nr_blocks
;
1030 count_symtabs_and_blocks (&nr_symtabs
, &nr_compunit_symtabs
, &nr_blocks
);
1031 gdb_printf (gdb_stdlog
,
1032 _("#symtabs: %d (+%d),"
1033 " #compunits: %d (+%d),"
1034 " #blocks: %d (+%d)\n"),
1036 nr_symtabs
- m_start_nr_symtabs
,
1037 nr_compunit_symtabs
,
1038 (nr_compunit_symtabs
1039 - m_start_nr_compunit_symtabs
),
1041 nr_blocks
- m_start_nr_blocks
);
1045 scoped_command_stats::scoped_command_stats (bool msg_type
)
1046 : m_msg_type (msg_type
)
1048 if (!m_msg_type
|| per_command_space
)
1050 #ifdef HAVE_USEFUL_SBRK
1051 char *lim
= (char *) sbrk (0);
1052 m_start_space
= lim
- lim_at_start
;
1053 m_space_enabled
= true;
1057 m_space_enabled
= false;
1059 if (msg_type
== 0 || per_command_time
)
1061 using namespace std::chrono
;
1063 m_start_cpu_time
= run_time_clock::now ();
1064 m_start_wall_time
= steady_clock::now ();
1065 m_time_enabled
= true;
1067 if (per_command_time
)
1068 print_time (_("command started"));
1071 m_time_enabled
= false;
1073 if (msg_type
== 0 || per_command_symtab
)
1075 int nr_symtabs
, nr_compunit_symtabs
, nr_blocks
;
1077 count_symtabs_and_blocks (&nr_symtabs
, &nr_compunit_symtabs
, &nr_blocks
);
1078 m_start_nr_symtabs
= nr_symtabs
;
1079 m_start_nr_compunit_symtabs
= nr_compunit_symtabs
;
1080 m_start_nr_blocks
= nr_blocks
;
1081 m_symtab_enabled
= true;
1084 m_symtab_enabled
= false;
1086 /* Initialize timer to keep track of how long we waited for the user. */
1087 reset_prompt_for_continue_wait_time ();
1093 scoped_command_stats::print_time (const char *msg
)
1095 using namespace std::chrono
;
1097 auto now
= system_clock::now ();
1098 auto ticks
= now
.time_since_epoch ().count () / (1000 * 1000);
1099 auto millis
= ticks
% 1000;
1101 std::time_t as_time
= system_clock::to_time_t (now
);
1103 localtime_r (&as_time
, &tm
);
1106 strftime (out
, sizeof (out
), "%F %H:%M:%S", &tm
);
1108 gdb_printf (gdb_stdlog
, "%s.%03d - %s\n", out
, (int) millis
, msg
);
1111 /* Handle unknown "mt set per-command" arguments.
1112 In this case have "mt set per-command on|off" affect every setting. */
1115 set_per_command_cmd (const char *args
, int from_tty
)
1117 struct cmd_list_element
*list
;
1120 val
= parse_cli_boolean_value (args
);
1122 error (_("Bad value for 'mt set per-command no'."));
1124 for (list
= per_command_setlist
; list
!= NULL
; list
= list
->next
)
1125 if (list
->var
->type () == var_boolean
)
1127 gdb_assert (list
->type
== set_cmd
);
1128 do_set_command (args
, from_tty
, list
);
1132 /* Options affecting the "maintenance selftest" command. */
1134 struct maintenance_selftest_options
1136 bool verbose
= false;
1137 } user_maintenance_selftest_options
;
1139 static const gdb::option::option_def maintenance_selftest_option_defs
[] = {
1140 gdb::option::boolean_option_def
<maintenance_selftest_options
> {
1142 [] (maintenance_selftest_options
*opt
) { return &opt
->verbose
; },
1144 N_("Set whether selftests run in verbose mode."),
1145 N_("Show whether selftests run in verbose mode."),
1147 When on, selftests may print verbose information."),
1151 /* Make option groups for the "maintenance selftest" command. */
1153 static std::array
<gdb::option::option_def_group
, 1>
1154 make_maintenance_selftest_option_group (maintenance_selftest_options
*opts
)
1157 {{maintenance_selftest_option_defs
}, opts
},
1161 /* The "maintenance selftest" command. */
1164 maintenance_selftest (const char *args
, int from_tty
)
1167 maintenance_selftest_options opts
= user_maintenance_selftest_options
;
1168 auto grp
= make_maintenance_selftest_option_group (&opts
);
1169 gdb::option::process_options
1170 (&args
, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR
, grp
);
1171 const gdb_argv
argv (args
);
1172 selftests::run_tests (argv
.as_array_view (), opts
.verbose
);
1175 Selftests have been disabled for this build.\n"));
1179 /* Completer for the "maintenance selftest" command. */
1182 maintenance_selftest_completer (cmd_list_element
*cmd
,
1183 completion_tracker
&tracker
,
1187 auto grp
= make_maintenance_selftest_option_group (nullptr);
1189 if (gdb::option::complete_options
1190 (tracker
, &text
, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR
, grp
))
1194 for (const auto &test
: selftests::all_selftests ())
1196 if (startswith (test
.name
.c_str (), text
))
1197 tracker
.add_completion (make_unique_xstrdup (test
.name
.c_str ()));
1203 maintenance_info_selftests (const char *arg
, int from_tty
)
1206 gdb_printf ("Registered selftests:\n");
1207 for (const auto &test
: selftests::all_selftests ())
1208 gdb_printf (" - %s\n", test
.name
.c_str ());
1211 Selftests have been disabled for this build.\n"));
1216 void _initialize_maint_cmds ();
1218 _initialize_maint_cmds ()
1220 struct cmd_list_element
*cmd
;
1222 cmd_list_element
*maintenance_cmd
1223 = add_basic_prefix_cmd ("maintenance", class_maintenance
, _("\
1224 Commands for use by GDB maintainers.\n\
1225 Includes commands to dump specific internal GDB structures in\n\
1226 a human readable form, to cause GDB to deliberately dump core, etc."),
1227 &maintenancelist
, 0,
1230 add_com_alias ("mt", maintenance_cmd
, class_maintenance
, 1);
1232 cmd_list_element
*maintenance_info_cmd
1233 = add_basic_prefix_cmd ("info", class_maintenance
, _("\
1234 Commands for showing internal info about the program being debugged."),
1235 &maintenanceinfolist
, 0,
1237 add_alias_cmd ("i", maintenance_info_cmd
, class_maintenance
, 1,
1240 const auto opts
= make_maint_info_sections_options_def_group (nullptr);
1241 static std::string maint_info_sections_command_help
1242 = gdb::option::build_help (_("\
1243 List the BFD sections of the exec and core files.\n\
1245 Usage: maintenance info sections [-all-objects] [FILTERS]\n\
1247 FILTERS is a list of words, each word is either:\n\
1248 + A section name - any section with this name will be printed, or\n\
1249 + A section flag - any section with this flag will be printed. The\n\
1251 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
1252 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
1254 Sections matching any of the FILTERS will be listed (no FILTERS implies\n\
1255 all sections should be printed).\n\
1259 cmd
= add_cmd ("sections", class_maintenance
, maintenance_info_sections
,
1260 maint_info_sections_command_help
.c_str (),
1261 &maintenanceinfolist
);
1262 set_cmd_completer_handle_brkchars (cmd
, maint_info_sections_completer
);
1264 add_cmd ("target-sections", class_maintenance
,
1265 maintenance_info_target_sections
, _("\
1266 List GDB's internal section table.\n\
1268 Print the current targets section list. This is a sub-set of all\n\
1269 sections, from all objects currently loaded. Usually the ALLOC\n\
1271 &maintenanceinfolist
);
1273 add_basic_prefix_cmd ("print", class_maintenance
,
1274 _("Maintenance command for printing GDB internal state."),
1275 &maintenanceprintlist
, 0,
1278 add_basic_prefix_cmd ("flush", class_maintenance
,
1279 _("Maintenance command for flushing GDB internal caches."),
1280 &maintenanceflushlist
, 0,
1283 add_basic_prefix_cmd ("set", class_maintenance
, _("\
1284 Set GDB internal variables used by the GDB maintainer.\n\
1285 Configure variables internal to GDB that aid in GDB's maintenance"),
1286 &maintenance_set_cmdlist
,
1290 add_show_prefix_cmd ("show", class_maintenance
, _("\
1291 Show GDB internal variables used by the GDB maintainer.\n\
1292 Configure variables internal to GDB that aid in GDB's maintenance"),
1293 &maintenance_show_cmdlist
,
1297 cmd
= add_cmd ("with", class_maintenance
, maintenance_with_cmd
, _("\
1298 Like \"with\", but works with \"maintenance set\" variables.\n\
1299 Usage: maintenance with SETTING [VALUE] [-- COMMAND]\n\
1300 With no COMMAND, repeats the last executed command.\n\
1301 SETTING is any setting you can change with the \"maintenance set\"\n\
1304 set_cmd_completer_handle_brkchars (cmd
, maintenance_with_cmd_completer
);
1307 add_cmd ("dump-me", class_maintenance
, maintenance_dump_me
, _("\
1308 Get fatal error; make debugger dump its core.\n\
1309 GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1310 itself a SIGQUIT signal."),
1314 add_cmd ("internal-error", class_maintenance
,
1315 maintenance_internal_error
, _("\
1316 Give GDB an internal error.\n\
1317 Cause GDB to behave as if an internal error was detected."),
1320 add_cmd ("internal-warning", class_maintenance
,
1321 maintenance_internal_warning
, _("\
1322 Give GDB an internal warning.\n\
1323 Cause GDB to behave as if an internal warning was reported."),
1326 add_cmd ("demangler-warning", class_maintenance
,
1327 maintenance_demangler_warning
, _("\
1328 Give GDB a demangler warning.\n\
1329 Cause GDB to behave as if a demangler warning was reported."),
1332 cmd
= add_cmd ("demangle", class_maintenance
, maintenance_demangle
, _("\
1333 This command has been moved to \"demangle\"."),
1335 deprecate_cmd (cmd
, "demangle");
1337 add_prefix_cmd ("per-command", class_maintenance
, set_per_command_cmd
, _("\
1338 Per-command statistics settings."),
1339 &per_command_setlist
,
1340 1/*allow-unknown*/, &maintenance_set_cmdlist
);
1342 add_show_prefix_cmd ("per-command", class_maintenance
, _("\
1343 Show per-command statistics settings."),
1344 &per_command_showlist
,
1345 0/*allow-unknown*/, &maintenance_show_cmdlist
);
1347 add_setshow_boolean_cmd ("time", class_maintenance
,
1348 &per_command_time
, _("\
1349 Set whether to display per-command execution time."), _("\
1350 Show whether to display per-command execution time."),
1352 If enabled, the execution time for each command will be\n\
1353 displayed following the command's output."),
1355 &per_command_setlist
, &per_command_showlist
);
1357 add_setshow_boolean_cmd ("space", class_maintenance
,
1358 &per_command_space
, _("\
1359 Set whether to display per-command space usage."), _("\
1360 Show whether to display per-command space usage."),
1362 If enabled, the space usage for each command will be\n\
1363 displayed following the command's output."),
1365 &per_command_setlist
, &per_command_showlist
);
1367 add_setshow_boolean_cmd ("symtab", class_maintenance
,
1368 &per_command_symtab
, _("\
1369 Set whether to display per-command symtab statistics."), _("\
1370 Show whether to display per-command symtab statistics."),
1372 If enabled, the basic symtab statistics for each command will be\n\
1373 displayed following the command's output."),
1375 &per_command_setlist
, &per_command_showlist
);
1377 /* This is equivalent to "mt set per-command time on".
1378 Kept because some people are used to typing "mt time 1". */
1379 add_cmd ("time", class_maintenance
, maintenance_time_display
, _("\
1380 Set the display of time usage.\n\
1381 If nonzero, will cause the execution time for each command to be\n\
1382 displayed, following the command's output."),
1385 /* This is equivalent to "mt set per-command space on".
1386 Kept because some people are used to typing "mt space 1". */
1387 add_cmd ("space", class_maintenance
, maintenance_space_display
, _("\
1388 Set the display of space usage.\n\
1389 If nonzero, will cause the execution space for each command to be\n\
1390 displayed, following the command's output."),
1393 cmd
= add_cmd ("type", class_maintenance
, maintenance_print_type
, _("\
1394 Print a type chain for a given symbol.\n\
1395 For each node in a type chain, print the raw data for each member of\n\
1396 the type structure, and the interpretation of the data."),
1397 &maintenanceprintlist
);
1398 set_cmd_completer (cmd
, expression_completer
);
1400 add_cmd ("statistics", class_maintenance
, maintenance_print_statistics
,
1401 _("Print statistics about internal gdb state."),
1402 &maintenanceprintlist
);
1404 add_cmd ("architecture", class_maintenance
,
1405 maintenance_print_architecture
, _("\
1406 Print the internal architecture configuration.\n\
1407 Takes an optional file parameter."),
1408 &maintenanceprintlist
);
1410 add_basic_prefix_cmd ("check", class_maintenance
, _("\
1411 Commands for checking internal gdb state."),
1412 &maintenancechecklist
, 0,
1415 add_cmd ("translate-address", class_maintenance
,
1416 maintenance_translate_address
,
1417 _("Translate a section name and address to a symbol."),
1420 add_cmd ("deprecate", class_maintenance
, maintenance_deprecate
, _("\
1421 Deprecate a command (for testing purposes).\n\
1422 Usage: maintenance deprecate COMMANDNAME [\"REPLACEMENT\"]\n\
1423 This is used by the testsuite to check the command deprecator.\n\
1424 You probably shouldn't use this,\n\
1425 rather you should use the C function deprecate_cmd()."), &maintenancelist
);
1427 add_cmd ("undeprecate", class_maintenance
, maintenance_undeprecate
, _("\
1428 Undeprecate a command (for testing purposes).\n\
1429 Usage: maintenance undeprecate COMMANDNAME\n\
1430 This is used by the testsuite to check the command deprecator.\n\
1431 You probably shouldn't use this."),
1434 cmd_list_element
*maintenance_selftest_cmd
1435 = add_cmd ("selftest", class_maintenance
, maintenance_selftest
, _("\
1436 Run gdb's unit tests.\n\
1437 Usage: maintenance selftest [FILTER]\n\
1438 This will run any unit tests that were built in to gdb.\n\
1439 If a filter is given, only the tests with that value in their name will ran."),
1441 set_cmd_completer_handle_brkchars (maintenance_selftest_cmd
,
1442 maintenance_selftest_completer
);
1444 add_cmd ("selftests", class_maintenance
, maintenance_info_selftests
,
1445 _("List the registered selftests."), &maintenanceinfolist
);
1447 add_setshow_boolean_cmd ("profile", class_maintenance
,
1448 &maintenance_profile_p
, _("\
1449 Set internal profiling."), _("\
1450 Show internal profiling."), _("\
1451 When enabled GDB is profiled."),
1452 maintenance_set_profile_cmd
,
1453 show_maintenance_profile_p
,
1454 &maintenance_set_cmdlist
,
1455 &maintenance_show_cmdlist
);
1457 add_setshow_zuinteger_unlimited_cmd ("worker-threads",
1459 &n_worker_threads
, _("\
1460 Set the number of worker threads GDB can use."), _("\
1461 Show the number of worker threads GDB can use."), _("\
1462 GDB may use multiple threads to speed up certain CPU-intensive operations,\n\
1463 such as demangling symbol names."),
1464 maintenance_set_worker_threads
,
1465 maintenance_show_worker_threads
,
1466 &maintenance_set_cmdlist
,
1467 &maintenance_show_cmdlist
);
1469 /* Add the "maint set/show selftest" commands. */
1470 static cmd_list_element
*set_selftest_cmdlist
= nullptr;
1471 static cmd_list_element
*show_selftest_cmdlist
= nullptr;
1473 add_setshow_prefix_cmd ("selftest", class_maintenance
,
1474 _("Self tests-related settings."),
1475 _("Self tests-related settings."),
1476 &set_selftest_cmdlist
, &show_selftest_cmdlist
,
1477 &maintenance_set_cmdlist
, &maintenance_show_cmdlist
);
1479 /* Add setting commands matching "maintenance selftest" options. */
1480 gdb::option::add_setshow_cmds_for_options (class_maintenance
,
1481 &user_maintenance_selftest_options
,
1482 maintenance_selftest_option_defs
,
1483 &set_selftest_cmdlist
,
1484 &show_selftest_cmdlist
);