* tracepoint.h (set_traceframe_number)
[deliverable/binutils-gdb.git] / gdb / maint.c
CommitLineData
c906108c 1/* Support for GDB maintenance commands.
c6f0559b 2
6aba47ca 3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
4c38e0a4 4 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
c6f0559b 5
c906108c
SS
6 Written by Fred Fish at Cygnus Support.
7
c5aa993b 8 This file is part of GDB.
c906108c 9
c5aa993b
JM
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
c5aa993b 13 (at your option) any later version.
c906108c 14
c5aa993b
JM
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
c906108c 19
c5aa993b 20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
22
23
24#include "defs.h"
e17c207e 25#include "arch-utils.h"
c906108c
SS
26#include <ctype.h>
27#include <signal.h>
28#include "command.h"
29#include "gdbcmd.h"
30#include "symtab.h"
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"
c14c28ba 39#include "gdb_assert.h"
c906108c 40
18a642a1
AC
41#include "cli/cli-decode.h"
42
a14ed312 43extern void _initialize_maint_cmds (void);
392a587b 44
a14ed312 45static void maintenance_command (char *, int);
c906108c 46
a14ed312 47static void maintenance_internal_error (char *args, int from_tty);
7be570e7 48
a14ed312 49static void maintenance_demangle (char *, int);
c906108c 50
a14ed312 51static void maintenance_time_display (char *, int);
c906108c 52
a14ed312 53static void maintenance_space_display (char *, int);
c906108c 54
a14ed312 55static void maintenance_info_command (char *, int);
c906108c 56
a14ed312 57static void maintenance_info_sections (char *, int);
c906108c 58
a14ed312 59static void maintenance_print_command (char *, int);
c906108c 60
1c689132
DB
61static void maintenance_do_deprecate (char *, int);
62
c906108c
SS
63/* Set this to the maximum number of seconds to wait instead of waiting forever
64 in target_wait(). If this timer times out, then it generates an error and
65 the command is aborted. This replaces most of the need for timeouts in the
66 GDB test suite, and makes it possible to distinguish between a hung target
67 and one with slow communications. */
68
69int watchdog = 0;
920d2a44
AC
70static void
71show_watchdog (struct ui_file *file, int from_tty,
72 struct cmd_list_element *c, const char *value)
73{
74 fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
75}
c906108c
SS
76
77/*
78
c5aa993b 79 LOCAL FUNCTION
c906108c 80
c5aa993b 81 maintenance_command -- access the maintenance subcommands
c906108c 82
c5aa993b 83 SYNOPSIS
c906108c 84
c5aa993b 85 void maintenance_command (char *args, int from_tty)
c906108c 86
c5aa993b 87 DESCRIPTION
c906108c 88
c5aa993b 89 */
c906108c
SS
90
91static void
fba45db2 92maintenance_command (char *args, int from_tty)
c906108c 93{
a3f17187 94 printf_unfiltered (_("\"maintenance\" must be followed by the name of a maintenance command.\n"));
c906108c
SS
95 help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
96}
97
98#ifndef _WIN32
c906108c 99static void
fba45db2 100maintenance_dump_me (char *args, int from_tty)
c906108c 101{
9e2f0ad4 102 if (query (_("Should GDB dump core? ")))
c906108c 103 {
7be570e7
JM
104#ifdef __DJGPP__
105 /* SIGQUIT by default is ignored, so use SIGABRT instead. */
106 signal (SIGABRT, SIG_DFL);
107 kill (getpid (), SIGABRT);
108#else
c906108c
SS
109 signal (SIGQUIT, SIG_DFL);
110 kill (getpid (), SIGQUIT);
7be570e7 111#endif
c906108c
SS
112 }
113}
114#endif
115
7be570e7
JM
116/* Stimulate the internal error mechanism that GDB uses when an
117 internal problem is detected. Allows testing of the mechanism.
118 Also useful when the user wants to drop a core file but not exit
119 GDB. */
120
121static void
122maintenance_internal_error (char *args, int from_tty)
123{
dec43320
AC
124 internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
125}
126
127/* Stimulate the internal error mechanism that GDB uses when an
128 internal problem is detected. Allows testing of the mechanism.
129 Also useful when the user wants to drop a core file but not exit
130 GDB. */
131
132static void
133maintenance_internal_warning (char *args, int from_tty)
134{
135 internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
7be570e7
JM
136}
137
33f91161
AC
138/* Someday we should allow demangling for things other than just
139 explicit strings. For example, we might want to be able to specify
140 the address of a string in either GDB's process space or the
141 debuggee's process space, and have gdb fetch and demangle that
142 string. If we have a char* pointer "ptr" that points to a string,
143 we might want to be able to given just the name and have GDB
144 demangle and print what it points to, etc. (FIXME) */
c906108c
SS
145
146static void
fba45db2 147maintenance_demangle (char *args, int from_tty)
c906108c
SS
148{
149 char *demangled;
150
151 if (args == NULL || *args == '\0')
152 {
a3f17187 153 printf_unfiltered (_("\"maintenance demangle\" takes an argument to demangle.\n"));
c906108c
SS
154 }
155 else
156 {
9a3d7dfd
AF
157 demangled = language_demangle (current_language, args,
158 DMGL_ANSI | DMGL_PARAMS);
c906108c
SS
159 if (demangled != NULL)
160 {
161 printf_unfiltered ("%s\n", demangled);
b8c9b27d 162 xfree (demangled);
c906108c
SS
163 }
164 else
165 {
a3f17187 166 printf_unfiltered (_("Can't demangle \"%s\"\n"), args);
c906108c
SS
167 }
168 }
169}
170
171static void
fba45db2 172maintenance_time_display (char *args, int from_tty)
c906108c
SS
173{
174 extern int display_time;
175
176 if (args == NULL || *args == '\0')
a3f17187 177 printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
c906108c
SS
178 else
179 display_time = strtol (args, NULL, 10);
180}
181
182static void
fba45db2 183maintenance_space_display (char *args, int from_tty)
c906108c
SS
184{
185 extern int display_space;
186
187 if (args == NULL || *args == '\0')
188 printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
189 else
190 display_space = strtol (args, NULL, 10);
191}
192
33f91161
AC
193/* The "maintenance info" command is defined as a prefix, with
194 allow_unknown 0. Therefore, its own definition is called only for
195 "maintenance info" with no args. */
c906108c 196
c906108c 197static void
fba45db2 198maintenance_info_command (char *arg, int from_tty)
c906108c 199{
a3f17187 200 printf_unfiltered (_("\"maintenance info\" must be followed by the name of an info command.\n"));
c906108c
SS
201 help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
202}
203
a532ca62
MS
204/* Mini tokenizing lexer for 'maint info sections' command. */
205
206static int
473e38f3 207match_substring (const char *string, const char *substr)
a532ca62
MS
208{
209 int substr_len = strlen(substr);
473e38f3 210 const char *tok;
a532ca62
MS
211
212 while ((tok = strstr (string, substr)) != NULL)
213 {
214 /* Got a partial match. Is it a whole word? */
b01d807c
MS
215 if (tok == string
216 || tok[-1] == ' '
217 || tok[-1] == '\t')
a532ca62
MS
218 {
219 /* Token is delimited at the front... */
b01d807c
MS
220 if (tok[substr_len] == ' '
221 || tok[substr_len] == '\t'
222 || tok[substr_len] == '\0')
a532ca62
MS
223 {
224 /* Token is delimited at the rear. Got a whole-word match. */
225 return 1;
226 }
227 }
228 /* Token didn't match as a whole word. Advance and try again. */
229 string = tok + 1;
230 }
231 return 0;
232}
233
43155bc1
MS
234static int
235match_bfd_flags (char *string, flagword flags)
c906108c 236{
43155bc1 237 if (flags & SEC_ALLOC)
a532ca62 238 if (match_substring (string, "ALLOC"))
43155bc1
MS
239 return 1;
240 if (flags & SEC_LOAD)
a532ca62 241 if (match_substring (string, "LOAD"))
43155bc1
MS
242 return 1;
243 if (flags & SEC_RELOC)
a532ca62 244 if (match_substring (string, "RELOC"))
43155bc1
MS
245 return 1;
246 if (flags & SEC_READONLY)
a532ca62 247 if (match_substring (string, "READONLY"))
43155bc1
MS
248 return 1;
249 if (flags & SEC_CODE)
a532ca62 250 if (match_substring (string, "CODE"))
43155bc1
MS
251 return 1;
252 if (flags & SEC_DATA)
a532ca62 253 if (match_substring (string, "DATA"))
43155bc1
MS
254 return 1;
255 if (flags & SEC_ROM)
a532ca62 256 if (match_substring (string, "ROM"))
43155bc1
MS
257 return 1;
258 if (flags & SEC_CONSTRUCTOR)
a532ca62 259 if (match_substring (string, "CONSTRUCTOR"))
43155bc1
MS
260 return 1;
261 if (flags & SEC_HAS_CONTENTS)
a532ca62 262 if (match_substring (string, "HAS_CONTENTS"))
43155bc1
MS
263 return 1;
264 if (flags & SEC_NEVER_LOAD)
a532ca62 265 if (match_substring (string, "NEVER_LOAD"))
43155bc1
MS
266 return 1;
267 if (flags & SEC_COFF_SHARED_LIBRARY)
a532ca62 268 if (match_substring (string, "COFF_SHARED_LIBRARY"))
43155bc1
MS
269 return 1;
270 if (flags & SEC_IS_COMMON)
a532ca62 271 if (match_substring (string, "IS_COMMON"))
43155bc1 272 return 1;
c906108c 273
43155bc1
MS
274 return 0;
275}
c906108c 276
43155bc1
MS
277static void
278print_bfd_flags (flagword flags)
279{
c906108c
SS
280 if (flags & SEC_ALLOC)
281 printf_filtered (" ALLOC");
282 if (flags & SEC_LOAD)
283 printf_filtered (" LOAD");
284 if (flags & SEC_RELOC)
285 printf_filtered (" RELOC");
286 if (flags & SEC_READONLY)
287 printf_filtered (" READONLY");
288 if (flags & SEC_CODE)
289 printf_filtered (" CODE");
290 if (flags & SEC_DATA)
291 printf_filtered (" DATA");
292 if (flags & SEC_ROM)
293 printf_filtered (" ROM");
294 if (flags & SEC_CONSTRUCTOR)
295 printf_filtered (" CONSTRUCTOR");
296 if (flags & SEC_HAS_CONTENTS)
297 printf_filtered (" HAS_CONTENTS");
298 if (flags & SEC_NEVER_LOAD)
299 printf_filtered (" NEVER_LOAD");
300 if (flags & SEC_COFF_SHARED_LIBRARY)
301 printf_filtered (" COFF_SHARED_LIBRARY");
302 if (flags & SEC_IS_COMMON)
303 printf_filtered (" IS_COMMON");
43155bc1
MS
304}
305
306static void
67a2b77e
AC
307maint_print_section_info (const char *name, flagword flags,
308 CORE_ADDR addr, CORE_ADDR endaddr,
5af949e3 309 unsigned long filepos, int addr_size)
43155bc1 310{
5af949e3
UW
311 printf_filtered (" %s", hex_string_custom (addr, addr_size));
312 printf_filtered ("->%s", hex_string_custom (endaddr, addr_size));
3ab13650 313 printf_filtered (" at %s",
bb599908 314 hex_string_custom ((unsigned long) filepos, 8));
e3d3bfda
MS
315 printf_filtered (": %s", name);
316 print_bfd_flags (flags);
317 printf_filtered ("\n");
318}
c906108c 319
e3d3bfda
MS
320static void
321print_bfd_section_info (bfd *abfd,
322 asection *asect,
323 void *arg)
324{
325 flagword flags = bfd_get_section_flags (abfd, asect);
326 const char *name = bfd_section_name (abfd, asect);
327
b01d807c
MS
328 if (arg == NULL || *((char *) arg) == '\0'
329 || match_substring ((char *) arg, name)
330 || match_bfd_flags ((char *) arg, flags))
e3d3bfda 331 {
5af949e3
UW
332 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
333 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
e3d3bfda
MS
334 CORE_ADDR addr, endaddr;
335
336 addr = bfd_section_vma (abfd, asect);
337 endaddr = addr + bfd_section_size (abfd, asect);
5af949e3
UW
338 maint_print_section_info (name, flags, addr, endaddr,
339 asect->filepos, addr_size);
e3d3bfda
MS
340 }
341}
342
343static void
344print_objfile_section_info (bfd *abfd,
345 struct obj_section *asect,
346 char *string)
347{
348 flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
349 const char *name = bfd_section_name (abfd, asect->the_bfd_section);
43155bc1 350
b01d807c
MS
351 if (string == NULL || *string == '\0'
352 || match_substring (string, name)
353 || match_bfd_flags (string, flags))
43155bc1 354 {
5af949e3
UW
355 struct gdbarch *gdbarch = gdbarch_from_bfd (abfd);
356 int addr_size = gdbarch_addr_bit (gdbarch) / 8;
f1f6aadf
PA
357 maint_print_section_info (name, flags,
358 obj_section_addr (asect),
359 obj_section_endaddr (asect),
5af949e3
UW
360 asect->the_bfd_section->filepos,
361 addr_size);
43155bc1 362 }
c906108c
SS
363}
364
c906108c 365static void
fba45db2 366maintenance_info_sections (char *arg, int from_tty)
c906108c
SS
367{
368 if (exec_bfd)
369 {
a3f17187 370 printf_filtered (_("Exec file:\n"));
c5aa993b 371 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
c906108c 372 wrap_here (" ");
a3f17187 373 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
a532ca62 374 if (arg && *arg && match_substring (arg, "ALLOBJ"))
e3d3bfda
MS
375 {
376 struct objfile *ofile;
377 struct obj_section *osect;
378
379 /* Only this function cares about the 'ALLOBJ' argument;
380 if 'ALLOBJ' is the only argument, discard it rather than
381 passing it down to print_objfile_section_info (which
382 wouldn't know how to handle it). */
383 if (strcmp (arg, "ALLOBJ") == 0)
384 arg = NULL;
385
386 ALL_OBJFILES (ofile)
387 {
a3f17187 388 printf_filtered (_(" Object file: %s\n"),
e3d3bfda
MS
389 bfd_get_filename (ofile->obfd));
390 ALL_OBJFILE_OSECTIONS (ofile, osect)
391 {
392 print_objfile_section_info (ofile->obfd, osect, arg);
393 }
394 }
395 }
396 else
397 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
c906108c
SS
398 }
399
400 if (core_bfd)
401 {
a3f17187 402 printf_filtered (_("Core file:\n"));
c5aa993b 403 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
c906108c 404 wrap_here (" ");
a3f17187 405 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
e3d3bfda 406 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
c906108c
SS
407 }
408}
409
c906108c 410void
fba45db2 411maintenance_print_statistics (char *args, int from_tty)
c906108c
SS
412{
413 print_objfile_statistics ();
414 print_symbol_bcache_statistics ();
415}
416
b9362cc7 417static void
4b9b3959
AC
418maintenance_print_architecture (char *args, int from_tty)
419{
e17c207e
UW
420 struct gdbarch *gdbarch = get_current_arch ();
421
4b9b3959 422 if (args == NULL)
e17c207e 423 gdbarch_dump (gdbarch, gdb_stdout);
4b9b3959
AC
424 else
425 {
724b958c 426 struct cleanup *cleanups;
4b9b3959
AC
427 struct ui_file *file = gdb_fopen (args, "w");
428 if (file == NULL)
e2e0b3e5 429 perror_with_name (_("maintenance print architecture"));
724b958c 430 cleanups = make_cleanup_ui_file_delete (file);
e17c207e 431 gdbarch_dump (gdbarch, file);
724b958c 432 do_cleanups (cleanups);
4b9b3959
AC
433 }
434}
435
33f91161
AC
436/* The "maintenance print" command is defined as a prefix, with
437 allow_unknown 0. Therefore, its own definition is called only for
438 "maintenance print" with no args. */
c906108c 439
c906108c 440static void
fba45db2 441maintenance_print_command (char *arg, int from_tty)
c906108c 442{
a3f17187 443 printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n"));
c906108c
SS
444 help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
445}
446
447/* The "maintenance translate-address" command converts a section and address
448 to a symbol. This can be called in two ways:
c5aa993b
JM
449 maintenance translate-address <secname> <addr>
450 or maintenance translate-address <addr>
451 */
c906108c
SS
452
453static void
fba45db2 454maintenance_translate_address (char *arg, int from_tty)
c906108c
SS
455{
456 CORE_ADDR address;
714835d5 457 struct obj_section *sect;
c906108c
SS
458 char *p;
459 struct minimal_symbol *sym;
460 struct objfile *objfile;
461
462 if (arg == NULL || *arg == 0)
8a3fe4f8 463 error (_("requires argument (address or section + address)"));
c906108c
SS
464
465 sect = NULL;
466 p = arg;
467
468 if (!isdigit (*p))
469 { /* See if we have a valid section name */
c5aa993b 470 while (*p && !isspace (*p)) /* Find end of section name */
c906108c
SS
471 p++;
472 if (*p == '\000') /* End of command? */
8a3fe4f8 473 error (_("Need to specify <section-name> and <address>"));
c906108c 474 *p++ = '\000';
c5aa993b
JM
475 while (isspace (*p))
476 p++; /* Skip whitespace */
c906108c 477
714835d5 478 ALL_OBJSECTIONS (objfile, sect)
c5aa993b 479 {
714835d5 480 if (strcmp (sect->the_bfd_section->name, arg) == 0)
c5aa993b
JM
481 break;
482 }
c906108c 483
15c99a44 484 if (!objfile)
8a3fe4f8 485 error (_("Unknown section %s."), arg);
c906108c
SS
486 }
487
488 address = parse_and_eval_address (p);
489
490 if (sect)
491 sym = lookup_minimal_symbol_by_pc_section (address, sect);
492 else
493 sym = lookup_minimal_symbol_by_pc (address);
494
495 if (sym)
c14c28ba
PP
496 {
497 const char *symbol_name = SYMBOL_PRINT_NAME (sym);
498 const char *symbol_offset = pulongest (address - SYMBOL_VALUE_ADDRESS (sym));
499
500 sect = SYMBOL_OBJ_SECTION(sym);
501 if (sect != NULL)
502 {
503 const char *section_name;
504 const char *obj_name;
505
506 gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
507 section_name = sect->the_bfd_section->name;
508
509 gdb_assert (sect->objfile && sect->objfile->name);
510 obj_name = sect->objfile->name;
511
512 if (MULTI_OBJFILE_P ())
513 printf_filtered (_("%s + %s in section %s of %s\n"),
514 symbol_name, symbol_offset, section_name, obj_name);
515 else
516 printf_filtered (_("%s + %s in section %s\n"),
517 symbol_name, symbol_offset, section_name);
518 }
519 else
520 printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
521 }
c906108c 522 else if (sect)
5af949e3
UW
523 printf_filtered (_("no symbol at %s:%s\n"),
524 sect->the_bfd_section->name, hex_string (address));
c906108c 525 else
5af949e3 526 printf_filtered (_("no symbol at %s\n"), hex_string (address));
c906108c
SS
527
528 return;
529}
530
56382845 531
c114dcd5 532/* When a command is deprecated the user will be warned the first time
33f91161
AC
533 the command is used. If possible, a replacement will be
534 offered. */
56382845
FN
535
536static void
537maintenance_deprecate (char *args, int from_tty)
538{
539 if (args == NULL || *args == '\0')
540 {
a3f17187 541 printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\
56382845 542the command you want to deprecate, and optionally the replacement command \n\
a3f17187 543enclosed in quotes.\n"));
56382845 544 }
33f91161 545
56382845
FN
546 maintenance_do_deprecate (args, 1);
547
548}
549
550
551static void
552maintenance_undeprecate (char *args, int from_tty)
553{
554 if (args == NULL || *args == '\0')
555 {
a3f17187
AC
556 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
557the command you want to undeprecate.\n"));
56382845 558 }
33f91161 559
56382845 560 maintenance_do_deprecate (args, 0);
33f91161 561
56382845
FN
562}
563
33f91161
AC
564/* You really shouldn't be using this. It is just for the testsuite.
565 Rather, you should use deprecate_cmd() when the command is created
566 in _initialize_blah().
567
568 This function deprecates a command and optionally assigns it a
569 replacement. */
570
8399535b 571static void
33f91161
AC
572maintenance_do_deprecate (char *text, int deprecate)
573{
574
575 struct cmd_list_element *alias = NULL;
576 struct cmd_list_element *prefix_cmd = NULL;
577 struct cmd_list_element *cmd = NULL;
578
579 char *start_ptr = NULL;
580 char *end_ptr = NULL;
56382845 581 int len;
33f91161
AC
582 char *replacement = NULL;
583
1c689132
DB
584 if (text == NULL)
585 return;
56382845 586
33f91161
AC
587 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
588 {
a3f17187 589 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
33f91161
AC
590 return;
591 }
56382845 592
56382845
FN
593 if (deprecate)
594 {
595 /* look for a replacement command */
80ce1ecb
AC
596 start_ptr = strchr (text, '\"');
597 if (start_ptr != NULL)
33f91161
AC
598 {
599 start_ptr++;
80ce1ecb
AC
600 end_ptr = strrchr (start_ptr, '\"');
601 if (end_ptr != NULL)
33f91161
AC
602 {
603 len = end_ptr - start_ptr;
604 start_ptr[len] = '\0';
605 replacement = xstrdup (start_ptr);
606 }
607 }
56382845 608 }
33f91161 609
56382845
FN
610 if (!start_ptr || !end_ptr)
611 replacement = NULL;
33f91161
AC
612
613
56382845 614 /* If they used an alias, we only want to deprecate the alias.
33f91161 615
56382845
FN
616 Note the MALLOCED_REPLACEMENT test. If the command's replacement
617 string was allocated at compile time we don't want to free the
33f91161 618 memory. */
56382845
FN
619 if (alias)
620 {
33f91161 621
56382845 622 if (alias->flags & MALLOCED_REPLACEMENT)
b8c9b27d 623 xfree (alias->replacement);
33f91161 624
56382845 625 if (deprecate)
33f91161 626 alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 627 else
33f91161
AC
628 alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
629 alias->replacement = replacement;
56382845
FN
630 alias->flags |= MALLOCED_REPLACEMENT;
631 return;
632 }
633 else if (cmd)
634 {
635 if (cmd->flags & MALLOCED_REPLACEMENT)
b8c9b27d 636 xfree (cmd->replacement);
56382845
FN
637
638 if (deprecate)
33f91161 639 cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 640 else
33f91161
AC
641 cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
642 cmd->replacement = replacement;
56382845
FN
643 cmd->flags |= MALLOCED_REPLACEMENT;
644 return;
645 }
646}
647
4f337972
AC
648/* Maintenance set/show framework. */
649
ae038cb0
DJ
650struct cmd_list_element *maintenance_set_cmdlist;
651struct cmd_list_element *maintenance_show_cmdlist;
4f337972
AC
652
653static void
654maintenance_set_cmd (char *args, int from_tty)
655{
a3f17187 656 printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n"));
4f337972
AC
657 help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
658}
659
660static void
661maintenance_show_cmd (char *args, int from_tty)
662{
663 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
664}
665
4f337972
AC
666/* Profiling support. */
667
668static int maintenance_profile_p;
920d2a44
AC
669static void
670show_maintenance_profile_p (struct ui_file *file, int from_tty,
671 struct cmd_list_element *c, const char *value)
672{
673 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
674}
d9feb4e7 675
b0b1c2c0
MK
676#ifdef HAVE__ETEXT
677extern char _etext;
678#define TEXTEND &_etext
01fe12f6 679#elif defined (HAVE_ETEXT)
b0b1c2c0
MK
680extern char etext;
681#define TEXTEND &etext
682#endif
683
01fe12f6
JB
684#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
685
d28f9cdf
DJ
686static int profiling_state;
687
688static void
689mcleanup_wrapper (void)
690{
691 extern void _mcleanup (void);
692
693 if (profiling_state)
694 _mcleanup ();
695}
4f337972
AC
696
697static void
698maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
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
709 extern void monstartup (unsigned long, unsigned long);
d28f9cdf
DJ
710 extern int main();
711
712 if (!profiling_initialized)
713 {
714 atexit (mcleanup_wrapper);
715 profiling_initialized = 1;
716 }
717
718 /* "main" is now always the first function in the text segment, so use
719 its address for monstartup. */
b0b1c2c0 720 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
d28f9cdf
DJ
721 }
722 else
723 {
724 extern void _mcleanup (void);
725 _mcleanup ();
726 }
4f337972 727}
d9feb4e7
DJ
728#else
729static void
730maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
731{
8a3fe4f8 732 error (_("Profiling support is not available on this system."));
d9feb4e7
DJ
733}
734#endif
56382845 735
c906108c 736void
fba45db2 737_initialize_maint_cmds (void)
c906108c 738{
4f337972
AC
739 struct cmd_list_element *tmpcmd;
740
1bedd215
AC
741 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
742Commands for use by GDB maintainers.\n\
c906108c
SS
743Includes commands to dump specific internal GDB structures in\n\
744a human readable form, to cause GDB to deliberately dump core,\n\
1bedd215 745to test internal functions such as the C++/ObjC demangler, etc."),
c906108c
SS
746 &maintenancelist, "maintenance ", 0,
747 &cmdlist);
748
749 add_com_alias ("mt", "maintenance", class_maintenance, 1);
750
1bedd215
AC
751 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
752Commands for showing internal info about the program being debugged."),
c906108c
SS
753 &maintenanceinfolist, "maintenance info ", 0,
754 &maintenancelist);
90515c23 755 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 756
1a966eab
AC
757 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
758List the BFD sections of the exec and core files. \n\
e3d3bfda
MS
759Arguments may be any combination of:\n\
760 [one or more section names]\n\
761 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
762 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
763Sections matching any argument will be listed (no argument\n\
764implies all sections). In addition, the special argument\n\
765 ALLOBJ\n\
1a966eab 766lists all sections from all object files, including shared libraries."),
c906108c
SS
767 &maintenanceinfolist);
768
769 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1bedd215 770 _("Maintenance command for printing GDB internal state."),
c906108c
SS
771 &maintenanceprintlist, "maintenance print ", 0,
772 &maintenancelist);
773
1bedd215 774 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
4f337972 775Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 776Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
777 &maintenance_set_cmdlist, "maintenance set ",
778 0/*allow-unknown*/,
779 &maintenancelist);
780
1bedd215 781 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
4f337972 782Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 783Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
784 &maintenance_show_cmdlist, "maintenance show ",
785 0/*allow-unknown*/,
786 &maintenancelist);
787
c906108c 788#ifndef _WIN32
1a966eab
AC
789 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
790Get fatal error; make debugger dump its core.\n\
8308e54c 791GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 792itself a SIGQUIT signal."),
c906108c
SS
793 &maintenancelist);
794#endif
795
1a966eab
AC
796 add_cmd ("internal-error", class_maintenance,
797 maintenance_internal_error, _("\
798Give GDB an internal error.\n\
799Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
800 &maintenancelist);
801
1a966eab
AC
802 add_cmd ("internal-warning", class_maintenance,
803 maintenance_internal_warning, _("\
804Give GDB an internal warning.\n\
805Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
806 &maintenancelist);
807
1a966eab
AC
808 add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
809Demangle a C++/ObjC mangled name.\n\
c906108c 810Call internal GDB demangler routine to demangle a C++ link name\n\
1a966eab 811and prints the result."),
c906108c
SS
812 &maintenancelist);
813
1a966eab
AC
814 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
815Set the display of time usage.\n\
c906108c 816If nonzero, will cause the execution time for each command to be\n\
1a966eab 817displayed, following the command's output."),
c906108c
SS
818 &maintenancelist);
819
1a966eab
AC
820 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
821Set the display of space usage.\n\
c906108c 822If nonzero, will cause the execution space for each command to be\n\
1a966eab 823displayed, following the command's output."),
c906108c
SS
824 &maintenancelist);
825
1a966eab
AC
826 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
827Print a type chain for a given symbol.\n\
c906108c 828For each node in a type chain, print the raw data for each member of\n\
1a966eab 829the type structure, and the interpretation of the data."),
c906108c
SS
830 &maintenanceprintlist);
831
1a966eab
AC
832 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
833Print dump of current symbol definitions.\n\
c906108c 834Entries in the full symbol table are dumped to file OUTFILE.\n\
1a966eab 835If a SOURCE file is specified, dump only that file's symbols."),
c906108c
SS
836 &maintenanceprintlist);
837
1a966eab
AC
838 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
839Print dump of current minimal symbol definitions.\n\
c906108c 840Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1a966eab 841If a SOURCE file is specified, dump only that file's minimal symbols."),
c906108c
SS
842 &maintenanceprintlist);
843
1a966eab
AC
844 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
845Print dump of current partial symbol definitions.\n\
c906108c 846Entries in the partial symbol table are dumped to file OUTFILE.\n\
1a966eab 847If a SOURCE file is specified, dump only that file's partial symbols."),
c906108c
SS
848 &maintenanceprintlist);
849
850 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1a966eab 851 _("Print dump of current object file definitions."),
c906108c
SS
852 &maintenanceprintlist);
853
1a966eab
AC
854 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
855List the full symbol tables for all object files.\n\
44ea7b70
JB
856This does not include information about individual symbols, blocks, or\n\
857linetables --- just the symbol table structures themselves.\n\
1a966eab 858With an argument REGEXP, list the symbol tables whose names that match that."),
5e7b2f39 859 &maintenanceinfolist);
44ea7b70 860
1a966eab
AC
861 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
862List the partial symbol tables for all object files.\n\
44ea7b70 863This does not include information about individual partial symbols,\n\
1a966eab 864just the symbol table structures themselves."),
5e7b2f39 865 &maintenanceinfolist);
44ea7b70 866
c906108c 867 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 868 _("Print statistics about internal gdb state."),
c906108c
SS
869 &maintenanceprintlist);
870
1a966eab
AC
871 add_cmd ("architecture", class_maintenance,
872 maintenance_print_architecture, _("\
873Print the internal architecture configuration.\n\
874Takes an optional file parameter."),
4b9b3959
AC
875 &maintenanceprintlist);
876
c906108c 877 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1a966eab 878 _("Check consistency of psymtabs and symtabs."),
c906108c
SS
879 &maintenancelist);
880
881 add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
1a966eab 882 _("Translate a section name and address to a symbol."),
c906108c
SS
883 &maintenancelist);
884
1a966eab
AC
885 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
886Deprecate a command. Note that this is just in here so the \n\
ef4cb050 887testsuite can check the command deprecator. You probably shouldn't use this,\n\
56382845 888rather you should use the C function deprecate_cmd(). If you decide you \n\
6f122dc9 889want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1a966eab 890replacement is optional."), &maintenancelist);
56382845 891
1a966eab
AC
892 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
893Undeprecate a command. Note that this is just in here so the \n\
ef4cb050 894testsuite can check the command deprecator. You probably shouldn't use this,\n\
1a966eab 895If you decide you want to use it: maintenance undeprecate 'commandname'"),
33f91161 896 &maintenancelist);
56382845 897
85c07804
AC
898 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
899Set watchdog timer."), _("\
900Show watchdog timer."), _("\
cb1a6d5f
AC
901When non-zero, this timeout is used instead of waiting forever for a target\n\
902to finish a low-level step or continue operation. If the specified amount\n\
85c07804
AC
903of time passes without a response from the target, an error occurs."),
904 NULL,
920d2a44 905 show_watchdog,
85c07804 906 &setlist, &showlist);
4f337972 907
d28f9cdf 908 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
909 &maintenance_profile_p, _("\
910Set internal profiling."), _("\
911Show internal profiling."), _("\
912When enabled GDB is profiled."),
2c5b56ce 913 maintenance_set_profile_cmd,
920d2a44 914 show_maintenance_profile_p,
d28f9cdf
DJ
915 &maintenance_set_cmdlist,
916 &maintenance_show_cmdlist);
c906108c 917}
This page took 0.940175 seconds and 4 git commands to generate.