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