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