Update copyright year range in all GDB files
[binutils-gdb.git] / gdb / maint.c
1 /* Support for GDB maintenance commands.
2
3 Copyright (C) 1992-2021 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 <cmath>
27 #include <signal.h>
28 #include "command.h"
29 #include "gdbcmd.h"
30 #include "symtab.h"
31 #include "block.h"
32 #include "gdbtypes.h"
33 #include "demangle.h"
34 #include "gdbcore.h"
35 #include "expression.h" /* For language.h */
36 #include "language.h"
37 #include "symfile.h"
38 #include "objfiles.h"
39 #include "value.h"
40 #include "top.h"
41 #include "maint.h"
42 #include "gdbsupport/selftest.h"
43
44 #include "cli/cli-decode.h"
45 #include "cli/cli-utils.h"
46 #include "cli/cli-setshow.h"
47 #include "cli/cli-cmds.h"
48
49 #if CXX_STD_THREAD
50 #include "gdbsupport/thread-pool.h"
51 #endif
52
53 static void maintenance_do_deprecate (const char *, int);
54
55 #ifndef _WIN32
56 static void
57 maintenance_dump_me (const char *args, int from_tty)
58 {
59 if (query (_("Should GDB dump core? ")))
60 {
61 #ifdef __DJGPP__
62 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
63 signal (SIGABRT, SIG_DFL);
64 kill (getpid (), SIGABRT);
65 #else
66 signal (SIGQUIT, SIG_DFL);
67 kill (getpid (), SIGQUIT);
68 #endif
69 }
70 }
71 #endif
72
73 /* Stimulate the internal error mechanism that GDB uses when an
74 internal problem is detected. Allows testing of the mechanism.
75 Also useful when the user wants to drop a core file but not exit
76 GDB. */
77
78 static void
79 maintenance_internal_error (const char *args, int from_tty)
80 {
81 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
82 }
83
84 /* Stimulate the internal error mechanism that GDB uses when an
85 internal problem is detected. Allows testing of the mechanism.
86 Also useful when the user wants to drop a core file but not exit
87 GDB. */
88
89 static void
90 maintenance_internal_warning (const char *args, int from_tty)
91 {
92 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
93 }
94
95 /* Stimulate the internal error mechanism that GDB uses when an
96 demangler problem is detected. Allows testing of the mechanism. */
97
98 static void
99 maintenance_demangler_warning (const char *args, int from_tty)
100 {
101 demangler_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
102 }
103
104 /* Old command to demangle a string. The command has been moved to "demangle".
105 It is kept for now because otherwise "mt demangle" gets interpreted as
106 "mt demangler-warning" which artificially creates an internal gdb error. */
107
108 static void
109 maintenance_demangle (const char *args, int from_tty)
110 {
111 printf_filtered (_("This command has been moved to \"demangle\".\n"));
112 }
113
114 static void
115 maintenance_time_display (const char *args, int from_tty)
116 {
117 if (args == NULL || *args == '\0')
118 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
119 else
120 set_per_command_time (strtol (args, NULL, 10));
121 }
122
123 static void
124 maintenance_space_display (const char *args, int from_tty)
125 {
126 if (args == NULL || *args == '\0')
127 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
128 else
129 set_per_command_space (strtol (args, NULL, 10));
130 }
131
132 /* Mini tokenizing lexer for 'maint info sections' command. */
133
134 static int
135 match_substring (const char *string, const char *substr)
136 {
137 int substr_len = strlen(substr);
138 const char *tok;
139
140 while ((tok = strstr (string, substr)) != NULL)
141 {
142 /* Got a partial match. Is it a whole word? */
143 if (tok == string
144 || tok[-1] == ' '
145 || tok[-1] == '\t')
146 {
147 /* Token is delimited at the front... */
148 if (tok[substr_len] == ' '
149 || tok[substr_len] == '\t'
150 || tok[substr_len] == '\0')
151 {
152 /* Token is delimited at the rear. Got a whole-word match. */
153 return 1;
154 }
155 }
156 /* Token didn't match as a whole word. Advance and try again. */
157 string = tok + 1;
158 }
159 return 0;
160 }
161
162 static int
163 match_bfd_flags (const char *string, flagword flags)
164 {
165 if (flags & SEC_ALLOC)
166 if (match_substring (string, "ALLOC"))
167 return 1;
168 if (flags & SEC_LOAD)
169 if (match_substring (string, "LOAD"))
170 return 1;
171 if (flags & SEC_RELOC)
172 if (match_substring (string, "RELOC"))
173 return 1;
174 if (flags & SEC_READONLY)
175 if (match_substring (string, "READONLY"))
176 return 1;
177 if (flags & SEC_CODE)
178 if (match_substring (string, "CODE"))
179 return 1;
180 if (flags & SEC_DATA)
181 if (match_substring (string, "DATA"))
182 return 1;
183 if (flags & SEC_ROM)
184 if (match_substring (string, "ROM"))
185 return 1;
186 if (flags & SEC_CONSTRUCTOR)
187 if (match_substring (string, "CONSTRUCTOR"))
188 return 1;
189 if (flags & SEC_HAS_CONTENTS)
190 if (match_substring (string, "HAS_CONTENTS"))
191 return 1;
192 if (flags & SEC_NEVER_LOAD)
193 if (match_substring (string, "NEVER_LOAD"))
194 return 1;
195 if (flags & SEC_COFF_SHARED_LIBRARY)
196 if (match_substring (string, "COFF_SHARED_LIBRARY"))
197 return 1;
198 if (flags & SEC_IS_COMMON)
199 if (match_substring (string, "IS_COMMON"))
200 return 1;
201
202 return 0;
203 }
204
205 static void
206 print_bfd_flags (flagword flags)
207 {
208 if (flags & SEC_ALLOC)
209 printf_filtered (" ALLOC");
210 if (flags & SEC_LOAD)
211 printf_filtered (" LOAD");
212 if (flags & SEC_RELOC)
213 printf_filtered (" RELOC");
214 if (flags & SEC_READONLY)
215 printf_filtered (" READONLY");
216 if (flags & SEC_CODE)
217 printf_filtered (" CODE");
218 if (flags & SEC_DATA)
219 printf_filtered (" DATA");
220 if (flags & SEC_ROM)
221 printf_filtered (" ROM");
222 if (flags & SEC_CONSTRUCTOR)
223 printf_filtered (" CONSTRUCTOR");
224 if (flags & SEC_HAS_CONTENTS)
225 printf_filtered (" HAS_CONTENTS");
226 if (flags & SEC_NEVER_LOAD)
227 printf_filtered (" NEVER_LOAD");
228 if (flags & SEC_COFF_SHARED_LIBRARY)
229 printf_filtered (" COFF_SHARED_LIBRARY");
230 if (flags & SEC_IS_COMMON)
231 printf_filtered (" IS_COMMON");
232 }
233
234 static void
235 maint_print_section_info (const char *name, flagword flags,
236 CORE_ADDR addr, CORE_ADDR endaddr,
237 unsigned long filepos, int addr_size)
238 {
239 printf_filtered (" %s", hex_string_custom (addr, addr_size));
240 printf_filtered ("->%s", hex_string_custom (endaddr, addr_size));
241 printf_filtered (" at %s",
242 hex_string_custom ((unsigned long) filepos, 8));
243 printf_filtered (": %s", name);
244 print_bfd_flags (flags);
245 printf_filtered ("\n");
246 }
247
248 /* Return the number of digits required to display COUNT in decimal.
249
250 Used when pretty printing index numbers to ensure all of the indexes line
251 up.*/
252
253 static int
254 index_digits (int count)
255 {
256 return ((int) log10 ((float) count)) + 1;
257 }
258
259 /* Helper function to pretty-print the section index of ASECT from ABFD.
260 The INDEX_DIGITS is the number of digits in the largest index that will
261 be printed, and is used to pretty-print the resulting string. */
262
263 static void
264 print_section_index (bfd *abfd,
265 asection *asect,
266 int index_digits)
267 {
268 std::string result
269 = string_printf (" [%d] ", gdb_bfd_section_index (abfd, asect));
270 /* The '+ 4' for the leading and trailing characters. */
271 printf_filtered ("%-*s", (index_digits + 4), result.c_str ());
272 }
273
274 /* Print information about ASECT from ABFD. The section will be printed using
275 the VMA's from the bfd, which will not be the relocated addresses for bfds
276 that should be relocated. The information must be printed with the same
277 layout as PRINT_OBJFILE_SECTION_INFO below.
278
279 ARG is the argument string passed by the user to the top level maintenance
280 info sections command. Used for filtering which sections are printed. */
281
282 static void
283 print_bfd_section_info (bfd *abfd, asection *asect, const char *arg,
284 int index_digits)
285 {
286 flagword flags = bfd_section_flags (asect);
287 const char *name = bfd_section_name (asect);
288
289 if (arg == NULL || *arg == '\0'
290 || match_substring (arg, name)
291 || match_bfd_flags (arg, flags))
292 {
293 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
294 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
295 CORE_ADDR addr, endaddr;
296
297 addr = bfd_section_vma (asect);
298 endaddr = addr + bfd_section_size (asect);
299 print_section_index (abfd, asect, index_digits);
300 maint_print_section_info (name, flags, addr, endaddr,
301 asect->filepos, addr_size);
302 }
303 }
304
305 /* Print information about ASECT which is GDB's wrapper around a section
306 from ABFD. The information must be printed with the same layout as
307 PRINT_BFD_SECTION_INFO above. PRINT_DATA holds information used to
308 filter which sections are printed, and for formatting the output.
309
310 ARG is the argument string passed by the user to the top level maintenance
311 info sections command. Used for filtering which sections are printed. */
312
313 static void
314 print_objfile_section_info (bfd *abfd, struct obj_section *asect,
315 const char *arg, int index_digits)
316 {
317 flagword flags = bfd_section_flags (asect->the_bfd_section);
318 const char *name = bfd_section_name (asect->the_bfd_section);
319
320 if (arg == NULL || *arg == '\0'
321 || match_substring (arg, name)
322 || match_bfd_flags (arg, flags))
323 {
324 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
325 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
326
327 print_section_index (abfd, asect->the_bfd_section, index_digits);
328 maint_print_section_info (name, flags,
329 obj_section_addr (asect),
330 obj_section_endaddr (asect),
331 asect->the_bfd_section->filepos,
332 addr_size);
333 }
334 }
335
336 /* Find an obj_section, GDB's wrapper around a bfd section for ASECTION
337 from ABFD. It might be that no such wrapper exists (for example debug
338 sections don't have such wrappers) in which case nullptr is returned. */
339
340 static obj_section *
341 maint_obj_section_from_bfd_section (bfd *abfd,
342 asection *asection,
343 objfile *ofile)
344 {
345 if (ofile->sections == nullptr)
346 return nullptr;
347
348 obj_section *osect
349 = &ofile->sections[gdb_bfd_section_index (abfd, asection)];
350
351 if (osect >= ofile->sections_end)
352 return nullptr;
353
354 return osect;
355 }
356
357 /* Print information about ASECT from ABFD. Where possible the information for
358 ASECT will print the relocated addresses of the section.
359
360 ARG is the argument string passed by the user to the top level maintenance
361 info sections command. Used for filtering which sections are printed. */
362
363 static void
364 print_bfd_section_info_maybe_relocated (bfd *abfd, asection *asect,
365 objfile *objfile, const char *arg,
366 int index_digits)
367 {
368 gdb_assert (objfile->sections != NULL);
369 obj_section *osect
370 = maint_obj_section_from_bfd_section (abfd, asect, objfile);
371
372 if (osect->the_bfd_section == NULL)
373 print_bfd_section_info (abfd, asect, arg, index_digits);
374 else
375 print_objfile_section_info (abfd, osect, arg, index_digits);
376 }
377
378 /* Implement the "maintenance info sections" command. */
379
380 static void
381 maintenance_info_sections (const char *arg, int from_tty)
382 {
383 if (current_program_space->exec_bfd ())
384 {
385 bool allobj = false;
386
387 printf_filtered (_("Exec file:\n"));
388 printf_filtered (" `%s', ",
389 bfd_get_filename (current_program_space->exec_bfd ()));
390 wrap_here (" ");
391 printf_filtered (_("file type %s.\n"),
392 bfd_get_target (current_program_space->exec_bfd ()));
393
394 /* Only this function cares about the 'ALLOBJ' argument;
395 if 'ALLOBJ' is the only argument, discard it rather than
396 passing it down to print_objfile_section_info (which
397 wouldn't know how to handle it). */
398 if (arg && strcmp (arg, "ALLOBJ") == 0)
399 {
400 arg = NULL;
401 allobj = true;
402 }
403
404 for (objfile *ofile : current_program_space->objfiles ())
405 {
406 if (allobj)
407 printf_filtered (_(" Object file: %s\n"),
408 bfd_get_filename (ofile->obfd));
409 else if (ofile->obfd != current_program_space->exec_bfd ())
410 continue;
411
412 int section_count = gdb_bfd_count_sections (ofile->obfd);
413
414 for (asection *sect : gdb_bfd_sections (ofile->obfd))
415 print_bfd_section_info_maybe_relocated
416 (ofile->obfd, sect, ofile, arg, index_digits (section_count));
417 }
418 }
419
420 if (core_bfd)
421 {
422 printf_filtered (_("Core file:\n"));
423 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
424 wrap_here (" ");
425 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
426
427 int section_count = gdb_bfd_count_sections (core_bfd);
428
429 for (asection *sect : gdb_bfd_sections (core_bfd))
430 print_bfd_section_info (core_bfd, sect, arg,
431 index_digits (section_count));
432 }
433 }
434
435 static void
436 maintenance_print_statistics (const char *args, int from_tty)
437 {
438 print_objfile_statistics ();
439 print_symbol_bcache_statistics ();
440 }
441
442 static void
443 maintenance_print_architecture (const char *args, int from_tty)
444 {
445 struct gdbarch *gdbarch = get_current_arch ();
446
447 if (args == NULL)
448 gdbarch_dump (gdbarch, gdb_stdout);
449 else
450 {
451 stdio_file file;
452
453 if (!file.open (args, "w"))
454 perror_with_name (_("maintenance print architecture"));
455 gdbarch_dump (gdbarch, &file);
456 }
457 }
458
459 /* The "maintenance translate-address" command converts a section and address
460 to a symbol. This can be called in two ways:
461 maintenance translate-address <secname> <addr>
462 or maintenance translate-address <addr>. */
463
464 static void
465 maintenance_translate_address (const char *arg, int from_tty)
466 {
467 CORE_ADDR address;
468 struct obj_section *sect;
469 const char *p;
470 struct bound_minimal_symbol sym;
471
472 if (arg == NULL || *arg == 0)
473 error (_("requires argument (address or section + address)"));
474
475 sect = NULL;
476 p = arg;
477
478 if (!isdigit (*p))
479 { /* See if we have a valid section name. */
480 while (*p && !isspace (*p)) /* Find end of section name. */
481 p++;
482 if (*p == '\000') /* End of command? */
483 error (_("Need to specify section name and address"));
484
485 int arg_len = p - arg;
486 p = skip_spaces (p + 1);
487
488 for (objfile *objfile : current_program_space->objfiles ())
489 ALL_OBJFILE_OSECTIONS (objfile, sect)
490 {
491 if (strncmp (sect->the_bfd_section->name, arg, arg_len) == 0)
492 goto found;
493 }
494
495 error (_("Unknown section %s."), arg);
496 found: ;
497 }
498
499 address = parse_and_eval_address (p);
500
501 if (sect)
502 sym = lookup_minimal_symbol_by_pc_section (address, sect);
503 else
504 sym = lookup_minimal_symbol_by_pc (address);
505
506 if (sym.minsym)
507 {
508 const char *symbol_name = sym.minsym->print_name ();
509 const char *symbol_offset
510 = pulongest (address - BMSYMBOL_VALUE_ADDRESS (sym));
511
512 sect = MSYMBOL_OBJ_SECTION(sym.objfile, sym.minsym);
513 if (sect != NULL)
514 {
515 const char *section_name;
516 const char *obj_name;
517
518 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
519 section_name = sect->the_bfd_section->name;
520
521 gdb_assert (sect->objfile && objfile_name (sect->objfile));
522 obj_name = objfile_name (sect->objfile);
523
524 if (current_program_space->multi_objfile_p ())
525 printf_filtered (_("%s + %s in section %s of %s\n"),
526 symbol_name, symbol_offset,
527 section_name, obj_name);
528 else
529 printf_filtered (_("%s + %s in section %s\n"),
530 symbol_name, symbol_offset, section_name);
531 }
532 else
533 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
534 }
535 else if (sect)
536 printf_filtered (_("no symbol at %s:%s\n"),
537 sect->the_bfd_section->name, hex_string (address));
538 else
539 printf_filtered (_("no symbol at %s\n"), hex_string (address));
540
541 return;
542 }
543
544
545 /* When a command is deprecated the user will be warned the first time
546 the command is used. If possible, a replacement will be
547 offered. */
548
549 static void
550 maintenance_deprecate (const char *args, int from_tty)
551 {
552 if (args == NULL || *args == '\0')
553 {
554 printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\
555 the command you want to deprecate, and optionally the replacement command\n\
556 enclosed in quotes.\n"));
557 }
558
559 maintenance_do_deprecate (args, 1);
560 }
561
562
563 static void
564 maintenance_undeprecate (const char *args, int from_tty)
565 {
566 if (args == NULL || *args == '\0')
567 {
568 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
569 the command you want to undeprecate.\n"));
570 }
571
572 maintenance_do_deprecate (args, 0);
573 }
574
575 /* You really shouldn't be using this. It is just for the testsuite.
576 Rather, you should use deprecate_cmd() when the command is created
577 in _initialize_blah().
578
579 This function deprecates a command and optionally assigns it a
580 replacement. */
581
582 static void
583 maintenance_do_deprecate (const char *text, int deprecate)
584 {
585 struct cmd_list_element *alias = NULL;
586 struct cmd_list_element *prefix_cmd = NULL;
587 struct cmd_list_element *cmd = NULL;
588
589 const char *start_ptr = NULL;
590 const char *end_ptr = NULL;
591 int len;
592 char *replacement = NULL;
593
594 if (text == NULL)
595 return;
596
597 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
598 {
599 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
600 return;
601 }
602
603 if (deprecate)
604 {
605 /* Look for a replacement command. */
606 start_ptr = strchr (text, '\"');
607 if (start_ptr != NULL)
608 {
609 start_ptr++;
610 end_ptr = strrchr (start_ptr, '\"');
611 if (end_ptr != NULL)
612 {
613 len = end_ptr - start_ptr;
614 replacement = savestring (start_ptr, len);
615 }
616 }
617 }
618
619 if (!start_ptr || !end_ptr)
620 replacement = NULL;
621
622
623 /* If they used an alias, we only want to deprecate the alias.
624
625 Note the MALLOCED_REPLACEMENT test. If the command's replacement
626 string was allocated at compile time we don't want to free the
627 memory. */
628 if (alias)
629 {
630 if (alias->malloced_replacement)
631 xfree ((char *) alias->replacement);
632
633 if (deprecate)
634 {
635 alias->deprecated_warn_user = 1;
636 alias->cmd_deprecated = 1;
637 }
638 else
639 {
640 alias->deprecated_warn_user = 0;
641 alias->cmd_deprecated = 0;
642 }
643 alias->replacement = replacement;
644 alias->malloced_replacement = 1;
645 return;
646 }
647 else if (cmd)
648 {
649 if (cmd->malloced_replacement)
650 xfree ((char *) cmd->replacement);
651
652 if (deprecate)
653 {
654 cmd->deprecated_warn_user = 1;
655 cmd->cmd_deprecated = 1;
656 }
657 else
658 {
659 cmd->deprecated_warn_user = 0;
660 cmd->cmd_deprecated = 0;
661 }
662 cmd->replacement = replacement;
663 cmd->malloced_replacement = 1;
664 return;
665 }
666 xfree (replacement);
667 }
668
669 /* Maintenance set/show framework. */
670
671 struct cmd_list_element *maintenance_set_cmdlist;
672 struct cmd_list_element *maintenance_show_cmdlist;
673
674 /* "maintenance with" command. */
675
676 static void
677 maintenance_with_cmd (const char *args, int from_tty)
678 {
679 with_command_1 ("maintenance set ", maintenance_set_cmdlist, args, from_tty);
680 }
681
682 /* "maintenance with" command completer. */
683
684 static void
685 maintenance_with_cmd_completer (struct cmd_list_element *ignore,
686 completion_tracker &tracker,
687 const char *text, const char * /*word*/)
688 {
689 with_command_completer_1 ("maintenance set ", tracker, text);
690 }
691
692 /* Profiling support. */
693
694 static bool maintenance_profile_p;
695 static void
696 show_maintenance_profile_p (struct ui_file *file, int from_tty,
697 struct cmd_list_element *c, const char *value)
698 {
699 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
700 }
701
702 #ifdef HAVE__ETEXT
703 extern char _etext;
704 #define TEXTEND &_etext
705 #elif defined (HAVE_ETEXT)
706 extern char etext;
707 #define TEXTEND &etext
708 #endif
709
710 #if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
711
712 static int profiling_state;
713
714 EXTERN_C void _mcleanup (void);
715
716 static void
717 mcleanup_wrapper (void)
718 {
719 if (profiling_state)
720 _mcleanup ();
721 }
722
723 EXTERN_C void monstartup (unsigned long, unsigned long);
724 extern int main ();
725
726 static void
727 maintenance_set_profile_cmd (const char *args, int from_tty,
728 struct cmd_list_element *c)
729 {
730 if (maintenance_profile_p == profiling_state)
731 return;
732
733 profiling_state = maintenance_profile_p;
734
735 if (maintenance_profile_p)
736 {
737 static int profiling_initialized;
738
739 if (!profiling_initialized)
740 {
741 atexit (mcleanup_wrapper);
742 profiling_initialized = 1;
743 }
744
745 /* "main" is now always the first function in the text segment, so use
746 its address for monstartup. */
747 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
748 }
749 else
750 {
751 extern void _mcleanup (void);
752
753 _mcleanup ();
754 }
755 }
756 #else
757 static void
758 maintenance_set_profile_cmd (const char *args, int from_tty,
759 struct cmd_list_element *c)
760 {
761 error (_("Profiling support is not available on this system."));
762 }
763 #endif
764
765 static int n_worker_threads = -1;
766
767 /* Update the thread pool for the desired number of threads. */
768 static void
769 update_thread_pool_size ()
770 {
771 #if CXX_STD_THREAD
772 int n_threads = n_worker_threads;
773
774 if (n_threads < 0)
775 n_threads = std::thread::hardware_concurrency ();
776
777 gdb::thread_pool::g_thread_pool->set_thread_count (n_threads);
778 #endif
779 }
780
781 static void
782 maintenance_set_worker_threads (const char *args, int from_tty,
783 struct cmd_list_element *c)
784 {
785 update_thread_pool_size ();
786 }
787
788 \f
789 /* If true, display time usage both at startup and for each command. */
790
791 static bool per_command_time;
792
793 /* If true, display space usage both at startup and for each command. */
794
795 static bool per_command_space;
796
797 /* If true, display basic symtab stats for each command. */
798
799 static bool per_command_symtab;
800
801 /* mt per-command commands. */
802
803 static struct cmd_list_element *per_command_setlist;
804 static struct cmd_list_element *per_command_showlist;
805
806 /* Set whether to display time statistics to NEW_VALUE
807 (non-zero means true). */
808
809 void
810 set_per_command_time (int new_value)
811 {
812 per_command_time = new_value;
813 }
814
815 /* Set whether to display space statistics to NEW_VALUE
816 (non-zero means true). */
817
818 void
819 set_per_command_space (int new_value)
820 {
821 per_command_space = new_value;
822 }
823
824 /* Count the number of symtabs and blocks. */
825
826 static void
827 count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_compunit_symtabs_ptr,
828 int *nr_blocks_ptr)
829 {
830 int nr_symtabs = 0;
831 int nr_compunit_symtabs = 0;
832 int nr_blocks = 0;
833
834 /* When collecting statistics during startup, this is called before
835 pretty much anything in gdb has been initialized, and thus
836 current_program_space may be NULL. */
837 if (current_program_space != NULL)
838 {
839 for (objfile *o : current_program_space->objfiles ())
840 {
841 for (compunit_symtab *cu : o->compunits ())
842 {
843 ++nr_compunit_symtabs;
844 nr_blocks += BLOCKVECTOR_NBLOCKS (COMPUNIT_BLOCKVECTOR (cu));
845 nr_symtabs += std::distance (compunit_filetabs (cu).begin (),
846 compunit_filetabs (cu).end ());
847 }
848 }
849 }
850
851 *nr_symtabs_ptr = nr_symtabs;
852 *nr_compunit_symtabs_ptr = nr_compunit_symtabs;
853 *nr_blocks_ptr = nr_blocks;
854 }
855
856 /* As indicated by display_time and display_space, report GDB's
857 elapsed time and space usage from the base time and space recorded
858 in this object. */
859
860 scoped_command_stats::~scoped_command_stats ()
861 {
862 /* Early exit if we're not reporting any stats. It can be expensive to
863 compute the pre-command values so don't collect them at all if we're
864 not reporting stats. Alas this doesn't work in the startup case because
865 we don't know yet whether we will be reporting the stats. For the
866 startup case collect the data anyway (it should be cheap at this point),
867 and leave it to the reporter to decide whether to print them. */
868 if (m_msg_type
869 && !per_command_time
870 && !per_command_space
871 && !per_command_symtab)
872 return;
873
874 if (m_time_enabled && per_command_time)
875 {
876 print_time (_("command finished"));
877
878 using namespace std::chrono;
879
880 run_time_clock::duration cmd_time
881 = run_time_clock::now () - m_start_cpu_time;
882
883 steady_clock::duration wall_time
884 = steady_clock::now () - m_start_wall_time;
885 /* Subtract time spend in prompt_for_continue from walltime. */
886 wall_time -= get_prompt_for_continue_wait_time ();
887
888 printf_unfiltered (!m_msg_type
889 ? _("Startup time: %.6f (cpu), %.6f (wall)\n")
890 : _("Command execution time: %.6f (cpu), %.6f (wall)\n"),
891 duration<double> (cmd_time).count (),
892 duration<double> (wall_time).count ());
893 }
894
895 if (m_space_enabled && per_command_space)
896 {
897 #ifdef HAVE_USEFUL_SBRK
898 char *lim = (char *) sbrk (0);
899
900 long space_now = lim - lim_at_start;
901 long space_diff = space_now - m_start_space;
902
903 printf_unfiltered (!m_msg_type
904 ? _("Space used: %ld (%s%ld during startup)\n")
905 : _("Space used: %ld (%s%ld for this command)\n"),
906 space_now,
907 (space_diff >= 0 ? "+" : ""),
908 space_diff);
909 #endif
910 }
911
912 if (m_symtab_enabled && per_command_symtab)
913 {
914 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
915
916 count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
917 printf_unfiltered (_("#symtabs: %d (+%d),"
918 " #compunits: %d (+%d),"
919 " #blocks: %d (+%d)\n"),
920 nr_symtabs,
921 nr_symtabs - m_start_nr_symtabs,
922 nr_compunit_symtabs,
923 (nr_compunit_symtabs
924 - m_start_nr_compunit_symtabs),
925 nr_blocks,
926 nr_blocks - m_start_nr_blocks);
927 }
928 }
929
930 scoped_command_stats::scoped_command_stats (bool msg_type)
931 : m_msg_type (msg_type)
932 {
933 if (!m_msg_type || per_command_space)
934 {
935 #ifdef HAVE_USEFUL_SBRK
936 char *lim = (char *) sbrk (0);
937 m_start_space = lim - lim_at_start;
938 m_space_enabled = 1;
939 #endif
940 }
941 else
942 m_space_enabled = 0;
943
944 if (msg_type == 0 || per_command_time)
945 {
946 using namespace std::chrono;
947
948 m_start_cpu_time = run_time_clock::now ();
949 m_start_wall_time = steady_clock::now ();
950 m_time_enabled = 1;
951
952 if (per_command_time)
953 print_time (_("command started"));
954 }
955 else
956 m_time_enabled = 0;
957
958 if (msg_type == 0 || per_command_symtab)
959 {
960 int nr_symtabs, nr_compunit_symtabs, nr_blocks;
961
962 count_symtabs_and_blocks (&nr_symtabs, &nr_compunit_symtabs, &nr_blocks);
963 m_start_nr_symtabs = nr_symtabs;
964 m_start_nr_compunit_symtabs = nr_compunit_symtabs;
965 m_start_nr_blocks = nr_blocks;
966 m_symtab_enabled = 1;
967 }
968 else
969 m_symtab_enabled = 0;
970
971 /* Initialize timer to keep track of how long we waited for the user. */
972 reset_prompt_for_continue_wait_time ();
973 }
974
975 /* See maint.h. */
976
977 void
978 scoped_command_stats::print_time (const char *msg)
979 {
980 using namespace std::chrono;
981
982 auto now = system_clock::now ();
983 auto ticks = now.time_since_epoch ().count () / (1000 * 1000);
984 auto millis = ticks % 1000;
985
986 std::time_t as_time = system_clock::to_time_t (now);
987 struct tm tm;
988 localtime_r (&as_time, &tm);
989
990 char out[100];
991 strftime (out, sizeof (out), "%F %H:%M:%S", &tm);
992
993 printf_unfiltered ("%s.%03d - %s\n", out, (int) millis, msg);
994 }
995
996 /* Handle unknown "mt set per-command" arguments.
997 In this case have "mt set per-command on|off" affect every setting. */
998
999 static void
1000 set_per_command_cmd (const char *args, int from_tty)
1001 {
1002 struct cmd_list_element *list;
1003 int val;
1004
1005 val = parse_cli_boolean_value (args);
1006 if (val < 0)
1007 error (_("Bad value for 'mt set per-command no'."));
1008
1009 for (list = per_command_setlist; list != NULL; list = list->next)
1010 if (list->var_type == var_boolean)
1011 {
1012 gdb_assert (list->type == set_cmd);
1013 do_set_command (args, from_tty, list);
1014 }
1015 }
1016
1017 \f
1018
1019 /* The "maintenance selftest" command. */
1020
1021 static void
1022 maintenance_selftest (const char *args, int from_tty)
1023 {
1024 #if GDB_SELF_TEST
1025 gdb_argv argv (args);
1026 selftests::run_tests (argv.as_array_view ());
1027 #else
1028 printf_filtered (_("\
1029 Selftests have been disabled for this build.\n"));
1030 #endif
1031 }
1032
1033 static void
1034 maintenance_info_selftests (const char *arg, int from_tty)
1035 {
1036 #if GDB_SELF_TEST
1037 printf_filtered ("Registered selftests:\n");
1038 selftests::for_each_selftest ([] (const std::string &name) {
1039 printf_filtered (" - %s\n", name.c_str ());
1040 });
1041 #else
1042 printf_filtered (_("\
1043 Selftests have been disabled for this build.\n"));
1044 #endif
1045 }
1046
1047 \f
1048 void _initialize_maint_cmds ();
1049 void
1050 _initialize_maint_cmds ()
1051 {
1052 struct cmd_list_element *cmd;
1053
1054 add_basic_prefix_cmd ("maintenance", class_maintenance, _("\
1055 Commands for use by GDB maintainers.\n\
1056 Includes commands to dump specific internal GDB structures in\n\
1057 a human readable form, to cause GDB to deliberately dump core, etc."),
1058 &maintenancelist, "maintenance ", 0,
1059 &cmdlist);
1060
1061 add_com_alias ("mt", "maintenance", class_maintenance, 1);
1062
1063 add_basic_prefix_cmd ("info", class_maintenance, _("\
1064 Commands for showing internal info about the program being debugged."),
1065 &maintenanceinfolist, "maintenance info ", 0,
1066 &maintenancelist);
1067 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
1068
1069 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
1070 List the BFD sections of the exec and core files.\n\
1071 Arguments may be any combination of:\n\
1072 [one or more section names]\n\
1073 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
1074 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
1075 Sections matching any argument will be listed (no argument\n\
1076 implies all sections). In addition, the special argument\n\
1077 ALLOBJ\n\
1078 lists all sections from all object files, including shared libraries."),
1079 &maintenanceinfolist);
1080
1081 add_basic_prefix_cmd ("print", class_maintenance,
1082 _("Maintenance command for printing GDB internal state."),
1083 &maintenanceprintlist, "maintenance print ", 0,
1084 &maintenancelist);
1085
1086 add_basic_prefix_cmd ("flush", class_maintenance,
1087 _("Maintenance command for flushing GDB internal caches."),
1088 &maintenanceflushlist, "maintenance flush ", 0,
1089 &maintenancelist);
1090
1091 add_basic_prefix_cmd ("set", class_maintenance, _("\
1092 Set GDB internal variables used by the GDB maintainer.\n\
1093 Configure variables internal to GDB that aid in GDB's maintenance"),
1094 &maintenance_set_cmdlist, "maintenance set ",
1095 0/*allow-unknown*/,
1096 &maintenancelist);
1097
1098 add_show_prefix_cmd ("show", class_maintenance, _("\
1099 Show GDB internal variables used by the GDB maintainer.\n\
1100 Configure variables internal to GDB that aid in GDB's maintenance"),
1101 &maintenance_show_cmdlist, "maintenance show ",
1102 0/*allow-unknown*/,
1103 &maintenancelist);
1104
1105 cmd = add_cmd ("with", class_maintenance, maintenance_with_cmd, _("\
1106 Like \"with\", but works with \"maintenance set\" variables.\n\
1107 Usage: maintenance with SETTING [VALUE] [-- COMMAND]\n\
1108 With no COMMAND, repeats the last executed command.\n\
1109 SETTING is any setting you can change with the \"maintenance set\"\n\
1110 subcommands."),
1111 &maintenancelist);
1112 set_cmd_completer_handle_brkchars (cmd, maintenance_with_cmd_completer);
1113
1114 #ifndef _WIN32
1115 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
1116 Get fatal error; make debugger dump its core.\n\
1117 GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1118 itself a SIGQUIT signal."),
1119 &maintenancelist);
1120 #endif
1121
1122 add_cmd ("internal-error", class_maintenance,
1123 maintenance_internal_error, _("\
1124 Give GDB an internal error.\n\
1125 Cause GDB to behave as if an internal error was detected."),
1126 &maintenancelist);
1127
1128 add_cmd ("internal-warning", class_maintenance,
1129 maintenance_internal_warning, _("\
1130 Give GDB an internal warning.\n\
1131 Cause GDB to behave as if an internal warning was reported."),
1132 &maintenancelist);
1133
1134 add_cmd ("demangler-warning", class_maintenance,
1135 maintenance_demangler_warning, _("\
1136 Give GDB a demangler warning.\n\
1137 Cause GDB to behave as if a demangler warning was reported."),
1138 &maintenancelist);
1139
1140 cmd = add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
1141 This command has been moved to \"demangle\"."),
1142 &maintenancelist);
1143 deprecate_cmd (cmd, "demangle");
1144
1145 add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
1146 Per-command statistics settings."),
1147 &per_command_setlist, "maintenance set per-command ",
1148 1/*allow-unknown*/, &maintenance_set_cmdlist);
1149
1150 add_show_prefix_cmd ("per-command", class_maintenance, _("\
1151 Show per-command statistics settings."),
1152 &per_command_showlist, "maintenance show per-command ",
1153 0/*allow-unknown*/, &maintenance_show_cmdlist);
1154
1155 add_setshow_boolean_cmd ("time", class_maintenance,
1156 &per_command_time, _("\
1157 Set whether to display per-command execution time."), _("\
1158 Show whether to display per-command execution time."),
1159 _("\
1160 If enabled, the execution time for each command will be\n\
1161 displayed following the command's output."),
1162 NULL, NULL,
1163 &per_command_setlist, &per_command_showlist);
1164
1165 add_setshow_boolean_cmd ("space", class_maintenance,
1166 &per_command_space, _("\
1167 Set whether to display per-command space usage."), _("\
1168 Show whether to display per-command space usage."),
1169 _("\
1170 If enabled, the space usage for each command will be\n\
1171 displayed following the command's output."),
1172 NULL, NULL,
1173 &per_command_setlist, &per_command_showlist);
1174
1175 add_setshow_boolean_cmd ("symtab", class_maintenance,
1176 &per_command_symtab, _("\
1177 Set whether to display per-command symtab statistics."), _("\
1178 Show whether to display per-command symtab statistics."),
1179 _("\
1180 If enabled, the basic symtab statistics for each command will be\n\
1181 displayed following the command's output."),
1182 NULL, NULL,
1183 &per_command_setlist, &per_command_showlist);
1184
1185 /* This is equivalent to "mt set per-command time on".
1186 Kept because some people are used to typing "mt time 1". */
1187 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
1188 Set the display of time usage.\n\
1189 If nonzero, will cause the execution time for each command to be\n\
1190 displayed, following the command's output."),
1191 &maintenancelist);
1192
1193 /* This is equivalent to "mt set per-command space on".
1194 Kept because some people are used to typing "mt space 1". */
1195 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
1196 Set the display of space usage.\n\
1197 If nonzero, will cause the execution space for each command to be\n\
1198 displayed, following the command's output."),
1199 &maintenancelist);
1200
1201 cmd = add_cmd ("type", class_maintenance, maintenance_print_type, _("\
1202 Print a type chain for a given symbol.\n\
1203 For each node in a type chain, print the raw data for each member of\n\
1204 the type structure, and the interpretation of the data."),
1205 &maintenanceprintlist);
1206 set_cmd_completer (cmd, expression_completer);
1207
1208 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1209 _("Print statistics about internal gdb state."),
1210 &maintenanceprintlist);
1211
1212 add_cmd ("architecture", class_maintenance,
1213 maintenance_print_architecture, _("\
1214 Print the internal architecture configuration.\n\
1215 Takes an optional file parameter."),
1216 &maintenanceprintlist);
1217
1218 add_basic_prefix_cmd ("check", class_maintenance, _("\
1219 Commands for checking internal gdb state."),
1220 &maintenancechecklist, "maintenance check ", 0,
1221 &maintenancelist);
1222
1223 add_cmd ("translate-address", class_maintenance,
1224 maintenance_translate_address,
1225 _("Translate a section name and address to a symbol."),
1226 &maintenancelist);
1227
1228 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
1229 Deprecate a command (for testing purposes).\n\
1230 Usage: maintenance deprecate COMMANDNAME [\"REPLACEMENT\"]\n\
1231 This is used by the testsuite to check the command deprecator.\n\
1232 You probably shouldn't use this,\n\
1233 rather you should use the C function deprecate_cmd()."), &maintenancelist);
1234
1235 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
1236 Undeprecate a command (for testing purposes).\n\
1237 Usage: maintenance undeprecate COMMANDNAME\n\
1238 This is used by the testsuite to check the command deprecator.\n\
1239 You probably shouldn't use this."),
1240 &maintenancelist);
1241
1242 add_cmd ("selftest", class_maintenance, maintenance_selftest, _("\
1243 Run gdb's unit tests.\n\
1244 Usage: maintenance selftest [FILTER]\n\
1245 This will run any unit tests that were built in to gdb.\n\
1246 If a filter is given, only the tests with that value in their name will ran."),
1247 &maintenancelist);
1248
1249 add_cmd ("selftests", class_maintenance, maintenance_info_selftests,
1250 _("List the registered selftests."), &maintenanceinfolist);
1251
1252 add_setshow_boolean_cmd ("profile", class_maintenance,
1253 &maintenance_profile_p, _("\
1254 Set internal profiling."), _("\
1255 Show internal profiling."), _("\
1256 When enabled GDB is profiled."),
1257 maintenance_set_profile_cmd,
1258 show_maintenance_profile_p,
1259 &maintenance_set_cmdlist,
1260 &maintenance_show_cmdlist);
1261
1262 add_setshow_zuinteger_unlimited_cmd ("worker-threads",
1263 class_maintenance,
1264 &n_worker_threads, _("\
1265 Set the number of worker threads GDB can use."), _("\
1266 Show the number of worker threads GDB can use."), _("\
1267 GDB may use multiple threads to speed up certain CPU-intensive operations,\n\
1268 such as demangling symbol names."),
1269 maintenance_set_worker_threads, NULL,
1270 &maintenance_set_cmdlist,
1271 &maintenance_show_cmdlist);
1272
1273 update_thread_pool_size ();
1274 }