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