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