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