]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/maint.c
Copyright updates for 2007.
[thirdparty/binutils-gdb.git] / gdb / maint.c
CommitLineData
c906108c 1/* Support for GDB maintenance commands.
c6f0559b 2
6aba47ca
DJ
3 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
4 2003, 2004, 2007 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
12 the Free Software Foundation; either version 2 of the License, or
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
JM
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
197e01b6
EZ
22 Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
c906108c
SS
24
25
26#include "defs.h"
c906108c
SS
27#include <ctype.h>
28#include <signal.h>
29#include "command.h"
30#include "gdbcmd.h"
31#include "symtab.h"
32#include "gdbtypes.h"
33#include "demangle.h"
34#include "gdbcore.h"
c5aa993b 35#include "expression.h" /* For language.h */
c906108c
SS
36#include "language.h"
37#include "symfile.h"
38#include "objfiles.h"
39#include "value.h"
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
SS
101{
102 if (query ("Should GDB dump core? "))
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,
309 unsigned long filepos)
43155bc1 310{
66bf4b3a
AC
311 /* FIXME-32x64: Need deprecated_print_address_numeric with field
312 width. */
e3d3bfda
MS
313 printf_filtered (" 0x%s", paddr (addr));
314 printf_filtered ("->0x%s", paddr (endaddr));
3ab13650 315 printf_filtered (" at %s",
bb599908 316 hex_string_custom ((unsigned long) filepos, 8));
e3d3bfda
MS
317 printf_filtered (": %s", name);
318 print_bfd_flags (flags);
319 printf_filtered ("\n");
320}
c906108c 321
e3d3bfda
MS
322static void
323print_bfd_section_info (bfd *abfd,
324 asection *asect,
325 void *arg)
326{
327 flagword flags = bfd_get_section_flags (abfd, asect);
328 const char *name = bfd_section_name (abfd, asect);
329
b01d807c
MS
330 if (arg == NULL || *((char *) arg) == '\0'
331 || match_substring ((char *) arg, name)
332 || match_bfd_flags ((char *) arg, flags))
e3d3bfda
MS
333 {
334 CORE_ADDR addr, endaddr;
335
336 addr = bfd_section_vma (abfd, asect);
337 endaddr = addr + bfd_section_size (abfd, asect);
67a2b77e 338 maint_print_section_info (name, flags, addr, endaddr, asect->filepos);
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 {
67a2b77e 354 maint_print_section_info (name, flags, asect->addr, asect->endaddr,
e3d3bfda 355 asect->the_bfd_section->filepos);
43155bc1 356 }
c906108c
SS
357}
358
c906108c 359static void
fba45db2 360maintenance_info_sections (char *arg, int from_tty)
c906108c
SS
361{
362 if (exec_bfd)
363 {
a3f17187 364 printf_filtered (_("Exec file:\n"));
c5aa993b 365 printf_filtered (" `%s', ", bfd_get_filename (exec_bfd));
c906108c 366 wrap_here (" ");
a3f17187 367 printf_filtered (_("file type %s.\n"), bfd_get_target (exec_bfd));
a532ca62 368 if (arg && *arg && match_substring (arg, "ALLOBJ"))
e3d3bfda
MS
369 {
370 struct objfile *ofile;
371 struct obj_section *osect;
372
373 /* Only this function cares about the 'ALLOBJ' argument;
374 if 'ALLOBJ' is the only argument, discard it rather than
375 passing it down to print_objfile_section_info (which
376 wouldn't know how to handle it). */
377 if (strcmp (arg, "ALLOBJ") == 0)
378 arg = NULL;
379
380 ALL_OBJFILES (ofile)
381 {
a3f17187 382 printf_filtered (_(" Object file: %s\n"),
e3d3bfda
MS
383 bfd_get_filename (ofile->obfd));
384 ALL_OBJFILE_OSECTIONS (ofile, osect)
385 {
386 print_objfile_section_info (ofile->obfd, osect, arg);
387 }
388 }
389 }
390 else
391 bfd_map_over_sections (exec_bfd, print_bfd_section_info, arg);
c906108c
SS
392 }
393
394 if (core_bfd)
395 {
a3f17187 396 printf_filtered (_("Core file:\n"));
c5aa993b 397 printf_filtered (" `%s', ", bfd_get_filename (core_bfd));
c906108c 398 wrap_here (" ");
a3f17187 399 printf_filtered (_("file type %s.\n"), bfd_get_target (core_bfd));
e3d3bfda 400 bfd_map_over_sections (core_bfd, print_bfd_section_info, arg);
c906108c
SS
401 }
402}
403
c906108c 404void
fba45db2 405maintenance_print_statistics (char *args, int from_tty)
c906108c
SS
406{
407 print_objfile_statistics ();
408 print_symbol_bcache_statistics ();
409}
410
b9362cc7 411static void
4b9b3959
AC
412maintenance_print_architecture (char *args, int from_tty)
413{
414 if (args == NULL)
415 gdbarch_dump (current_gdbarch, gdb_stdout);
416 else
417 {
418 struct ui_file *file = gdb_fopen (args, "w");
419 if (file == NULL)
e2e0b3e5 420 perror_with_name (_("maintenance print architecture"));
4b9b3959
AC
421 gdbarch_dump (current_gdbarch, file);
422 ui_file_delete (file);
423 }
424}
425
33f91161
AC
426/* The "maintenance print" command is defined as a prefix, with
427 allow_unknown 0. Therefore, its own definition is called only for
428 "maintenance print" with no args. */
c906108c 429
c906108c 430static void
fba45db2 431maintenance_print_command (char *arg, int from_tty)
c906108c 432{
a3f17187 433 printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n"));
c906108c
SS
434 help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
435}
436
437/* The "maintenance translate-address" command converts a section and address
438 to a symbol. This can be called in two ways:
c5aa993b
JM
439 maintenance translate-address <secname> <addr>
440 or maintenance translate-address <addr>
441 */
c906108c
SS
442
443static void
fba45db2 444maintenance_translate_address (char *arg, int from_tty)
c906108c
SS
445{
446 CORE_ADDR address;
447 asection *sect;
448 char *p;
449 struct minimal_symbol *sym;
450 struct objfile *objfile;
451
452 if (arg == NULL || *arg == 0)
8a3fe4f8 453 error (_("requires argument (address or section + address)"));
c906108c
SS
454
455 sect = NULL;
456 p = arg;
457
458 if (!isdigit (*p))
459 { /* See if we have a valid section name */
c5aa993b 460 while (*p && !isspace (*p)) /* Find end of section name */
c906108c
SS
461 p++;
462 if (*p == '\000') /* End of command? */
8a3fe4f8 463 error (_("Need to specify <section-name> and <address>"));
c906108c 464 *p++ = '\000';
c5aa993b
JM
465 while (isspace (*p))
466 p++; /* Skip whitespace */
c906108c
SS
467
468 ALL_OBJFILES (objfile)
c5aa993b
JM
469 {
470 sect = bfd_get_section_by_name (objfile->obfd, arg);
471 if (sect != NULL)
472 break;
473 }
c906108c
SS
474
475 if (!sect)
8a3fe4f8 476 error (_("Unknown section %s."), arg);
c906108c
SS
477 }
478
479 address = parse_and_eval_address (p);
480
481 if (sect)
482 sym = lookup_minimal_symbol_by_pc_section (address, sect);
483 else
484 sym = lookup_minimal_symbol_by_pc (address);
485
486 if (sym)
d4f3574e 487 printf_filtered ("%s+%s\n",
de5ad195 488 SYMBOL_PRINT_NAME (sym),
d4f3574e 489 paddr_u (address - SYMBOL_VALUE_ADDRESS (sym)));
c906108c 490 else if (sect)
a3f17187 491 printf_filtered (_("no symbol at %s:0x%s\n"), sect->name, paddr (address));
c906108c 492 else
a3f17187 493 printf_filtered (_("no symbol at 0x%s\n"), paddr (address));
c906108c
SS
494
495 return;
496}
497
56382845 498
c114dcd5 499/* When a command is deprecated the user will be warned the first time
33f91161
AC
500 the command is used. If possible, a replacement will be
501 offered. */
56382845
FN
502
503static void
504maintenance_deprecate (char *args, int from_tty)
505{
506 if (args == NULL || *args == '\0')
507 {
a3f17187 508 printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\
56382845 509the command you want to deprecate, and optionally the replacement command \n\
a3f17187 510enclosed in quotes.\n"));
56382845 511 }
33f91161 512
56382845
FN
513 maintenance_do_deprecate (args, 1);
514
515}
516
517
518static void
519maintenance_undeprecate (char *args, int from_tty)
520{
521 if (args == NULL || *args == '\0')
522 {
a3f17187
AC
523 printf_unfiltered (_("\"maintenance undeprecate\" takes an argument, \n\
524the command you want to undeprecate.\n"));
56382845 525 }
33f91161 526
56382845 527 maintenance_do_deprecate (args, 0);
33f91161 528
56382845
FN
529}
530
33f91161
AC
531/* You really shouldn't be using this. It is just for the testsuite.
532 Rather, you should use deprecate_cmd() when the command is created
533 in _initialize_blah().
534
535 This function deprecates a command and optionally assigns it a
536 replacement. */
537
8399535b 538static void
33f91161
AC
539maintenance_do_deprecate (char *text, int deprecate)
540{
541
542 struct cmd_list_element *alias = NULL;
543 struct cmd_list_element *prefix_cmd = NULL;
544 struct cmd_list_element *cmd = NULL;
545
546 char *start_ptr = NULL;
547 char *end_ptr = NULL;
56382845 548 int len;
33f91161
AC
549 char *replacement = NULL;
550
1c689132
DB
551 if (text == NULL)
552 return;
56382845 553
33f91161
AC
554 if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
555 {
a3f17187 556 printf_filtered (_("Can't find command '%s' to deprecate.\n"), text);
33f91161
AC
557 return;
558 }
56382845 559
56382845
FN
560 if (deprecate)
561 {
562 /* look for a replacement command */
80ce1ecb
AC
563 start_ptr = strchr (text, '\"');
564 if (start_ptr != NULL)
33f91161
AC
565 {
566 start_ptr++;
80ce1ecb
AC
567 end_ptr = strrchr (start_ptr, '\"');
568 if (end_ptr != NULL)
33f91161
AC
569 {
570 len = end_ptr - start_ptr;
571 start_ptr[len] = '\0';
572 replacement = xstrdup (start_ptr);
573 }
574 }
56382845 575 }
33f91161 576
56382845
FN
577 if (!start_ptr || !end_ptr)
578 replacement = NULL;
33f91161
AC
579
580
56382845 581 /* If they used an alias, we only want to deprecate the alias.
33f91161 582
56382845
FN
583 Note the MALLOCED_REPLACEMENT test. If the command's replacement
584 string was allocated at compile time we don't want to free the
33f91161 585 memory. */
56382845
FN
586 if (alias)
587 {
33f91161 588
56382845 589 if (alias->flags & MALLOCED_REPLACEMENT)
b8c9b27d 590 xfree (alias->replacement);
33f91161 591
56382845 592 if (deprecate)
33f91161 593 alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 594 else
33f91161
AC
595 alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
596 alias->replacement = replacement;
56382845
FN
597 alias->flags |= MALLOCED_REPLACEMENT;
598 return;
599 }
600 else if (cmd)
601 {
602 if (cmd->flags & MALLOCED_REPLACEMENT)
b8c9b27d 603 xfree (cmd->replacement);
56382845
FN
604
605 if (deprecate)
33f91161 606 cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
56382845 607 else
33f91161
AC
608 cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
609 cmd->replacement = replacement;
56382845
FN
610 cmd->flags |= MALLOCED_REPLACEMENT;
611 return;
612 }
613}
614
4f337972
AC
615/* Maintenance set/show framework. */
616
ae038cb0
DJ
617struct cmd_list_element *maintenance_set_cmdlist;
618struct cmd_list_element *maintenance_show_cmdlist;
4f337972
AC
619
620static void
621maintenance_set_cmd (char *args, int from_tty)
622{
a3f17187 623 printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n"));
4f337972
AC
624 help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout);
625}
626
627static void
628maintenance_show_cmd (char *args, int from_tty)
629{
630 cmd_show_list (maintenance_show_cmdlist, from_tty, "");
631}
632
4f337972
AC
633/* Profiling support. */
634
635static int maintenance_profile_p;
920d2a44
AC
636static void
637show_maintenance_profile_p (struct ui_file *file, int from_tty,
638 struct cmd_list_element *c, const char *value)
639{
640 fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
641}
d9feb4e7
DJ
642
643#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP)
644
b0b1c2c0
MK
645#ifdef HAVE__ETEXT
646extern char _etext;
647#define TEXTEND &_etext
648#else
649extern char etext;
650#define TEXTEND &etext
651#endif
652
d28f9cdf
DJ
653static int profiling_state;
654
655static void
656mcleanup_wrapper (void)
657{
658 extern void _mcleanup (void);
659
660 if (profiling_state)
661 _mcleanup ();
662}
4f337972
AC
663
664static void
665maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
666{
d28f9cdf
DJ
667 if (maintenance_profile_p == profiling_state)
668 return;
669
670 profiling_state = maintenance_profile_p;
671
672 if (maintenance_profile_p)
673 {
674 static int profiling_initialized;
675
676 extern void monstartup (unsigned long, unsigned long);
d28f9cdf
DJ
677 extern int main();
678
679 if (!profiling_initialized)
680 {
681 atexit (mcleanup_wrapper);
682 profiling_initialized = 1;
683 }
684
685 /* "main" is now always the first function in the text segment, so use
686 its address for monstartup. */
b0b1c2c0 687 monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
d28f9cdf
DJ
688 }
689 else
690 {
691 extern void _mcleanup (void);
692 _mcleanup ();
693 }
4f337972 694}
d9feb4e7
DJ
695#else
696static void
697maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
698{
8a3fe4f8 699 error (_("Profiling support is not available on this system."));
d9feb4e7
DJ
700}
701#endif
56382845 702
c906108c 703void
fba45db2 704_initialize_maint_cmds (void)
c906108c 705{
4f337972
AC
706 struct cmd_list_element *tmpcmd;
707
1bedd215
AC
708 add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\
709Commands for use by GDB maintainers.\n\
c906108c
SS
710Includes commands to dump specific internal GDB structures in\n\
711a human readable form, to cause GDB to deliberately dump core,\n\
1bedd215 712to test internal functions such as the C++/ObjC demangler, etc."),
c906108c
SS
713 &maintenancelist, "maintenance ", 0,
714 &cmdlist);
715
716 add_com_alias ("mt", "maintenance", class_maintenance, 1);
717
1bedd215
AC
718 add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
719Commands for showing internal info about the program being debugged."),
c906108c
SS
720 &maintenanceinfolist, "maintenance info ", 0,
721 &maintenancelist);
90515c23 722 add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
c906108c 723
1a966eab
AC
724 add_cmd ("sections", class_maintenance, maintenance_info_sections, _("\
725List the BFD sections of the exec and core files. \n\
e3d3bfda
MS
726Arguments may be any combination of:\n\
727 [one or more section names]\n\
728 ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
729 HAS_CONTENTS NEVER_LOAD COFF_SHARED_LIBRARY IS_COMMON\n\
730Sections matching any argument will be listed (no argument\n\
731implies all sections). In addition, the special argument\n\
732 ALLOBJ\n\
1a966eab 733lists all sections from all object files, including shared libraries."),
c906108c
SS
734 &maintenanceinfolist);
735
736 add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
1bedd215 737 _("Maintenance command for printing GDB internal state."),
c906108c
SS
738 &maintenanceprintlist, "maintenance print ", 0,
739 &maintenancelist);
740
1bedd215 741 add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
4f337972 742Set GDB internal variables used by the GDB maintainer.\n\
1bedd215 743Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
744 &maintenance_set_cmdlist, "maintenance set ",
745 0/*allow-unknown*/,
746 &maintenancelist);
747
1bedd215 748 add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
4f337972 749Show GDB internal variables used by the GDB maintainer.\n\
1bedd215 750Configure variables internal to GDB that aid in GDB's maintenance"),
4f337972
AC
751 &maintenance_show_cmdlist, "maintenance show ",
752 0/*allow-unknown*/,
753 &maintenancelist);
754
c906108c 755#ifndef _WIN32
1a966eab
AC
756 add_cmd ("dump-me", class_maintenance, maintenance_dump_me, _("\
757Get fatal error; make debugger dump its core.\n\
8308e54c 758GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
1a966eab 759itself a SIGQUIT signal."),
c906108c
SS
760 &maintenancelist);
761#endif
762
1a966eab
AC
763 add_cmd ("internal-error", class_maintenance,
764 maintenance_internal_error, _("\
765Give GDB an internal error.\n\
766Cause GDB to behave as if an internal error was detected."),
7be570e7
JM
767 &maintenancelist);
768
1a966eab
AC
769 add_cmd ("internal-warning", class_maintenance,
770 maintenance_internal_warning, _("\
771Give GDB an internal warning.\n\
772Cause GDB to behave as if an internal warning was reported."),
dec43320
AC
773 &maintenancelist);
774
1a966eab
AC
775 add_cmd ("demangle", class_maintenance, maintenance_demangle, _("\
776Demangle a C++/ObjC mangled name.\n\
c906108c 777Call internal GDB demangler routine to demangle a C++ link name\n\
1a966eab 778and prints the result."),
c906108c
SS
779 &maintenancelist);
780
1a966eab
AC
781 add_cmd ("time", class_maintenance, maintenance_time_display, _("\
782Set the display of time usage.\n\
c906108c 783If nonzero, will cause the execution time for each command to be\n\
1a966eab 784displayed, following the command's output."),
c906108c
SS
785 &maintenancelist);
786
1a966eab
AC
787 add_cmd ("space", class_maintenance, maintenance_space_display, _("\
788Set the display of space usage.\n\
c906108c 789If nonzero, will cause the execution space for each command to be\n\
1a966eab 790displayed, following the command's output."),
c906108c
SS
791 &maintenancelist);
792
1a966eab
AC
793 add_cmd ("type", class_maintenance, maintenance_print_type, _("\
794Print a type chain for a given symbol.\n\
c906108c 795For each node in a type chain, print the raw data for each member of\n\
1a966eab 796the type structure, and the interpretation of the data."),
c906108c
SS
797 &maintenanceprintlist);
798
1a966eab
AC
799 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
800Print dump of current symbol definitions.\n\
c906108c 801Entries in the full symbol table are dumped to file OUTFILE.\n\
1a966eab 802If a SOURCE file is specified, dump only that file's symbols."),
c906108c
SS
803 &maintenanceprintlist);
804
1a966eab
AC
805 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
806Print dump of current minimal symbol definitions.\n\
c906108c 807Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1a966eab 808If a SOURCE file is specified, dump only that file's minimal symbols."),
c906108c
SS
809 &maintenanceprintlist);
810
1a966eab
AC
811 add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, _("\
812Print dump of current partial symbol definitions.\n\
c906108c 813Entries in the partial symbol table are dumped to file OUTFILE.\n\
1a966eab 814If a SOURCE file is specified, dump only that file's partial symbols."),
c906108c
SS
815 &maintenanceprintlist);
816
817 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1a966eab 818 _("Print dump of current object file definitions."),
c906108c
SS
819 &maintenanceprintlist);
820
1a966eab
AC
821 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
822List the full symbol tables for all object files.\n\
44ea7b70
JB
823This does not include information about individual symbols, blocks, or\n\
824linetables --- just the symbol table structures themselves.\n\
1a966eab 825With an argument REGEXP, list the symbol tables whose names that match that."),
5e7b2f39 826 &maintenanceinfolist);
44ea7b70 827
1a966eab
AC
828 add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs, _("\
829List the partial symbol tables for all object files.\n\
44ea7b70 830This does not include information about individual partial symbols,\n\
1a966eab 831just the symbol table structures themselves."),
5e7b2f39 832 &maintenanceinfolist);
44ea7b70 833
c906108c 834 add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
1a966eab 835 _("Print statistics about internal gdb state."),
c906108c
SS
836 &maintenanceprintlist);
837
1a966eab
AC
838 add_cmd ("architecture", class_maintenance,
839 maintenance_print_architecture, _("\
840Print the internal architecture configuration.\n\
841Takes an optional file parameter."),
4b9b3959
AC
842 &maintenanceprintlist);
843
c906108c 844 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1a966eab 845 _("Check consistency of psymtabs and symtabs."),
c906108c
SS
846 &maintenancelist);
847
848 add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
1a966eab 849 _("Translate a section name and address to a symbol."),
c906108c
SS
850 &maintenancelist);
851
1a966eab
AC
852 add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
853Deprecate a command. Note that this is just in here so the \n\
56382845
FN
854testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
855rather you should use the C function deprecate_cmd(). If you decide you \n\
6f122dc9 856want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
1a966eab 857replacement is optional."), &maintenancelist);
56382845 858
1a966eab
AC
859 add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
860Undeprecate a command. Note that this is just in here so the \n\
56382845 861testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
1a966eab 862If you decide you want to use it: maintenance undeprecate 'commandname'"),
33f91161 863 &maintenancelist);
56382845 864
85c07804
AC
865 add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
866Set watchdog timer."), _("\
867Show watchdog timer."), _("\
cb1a6d5f
AC
868When non-zero, this timeout is used instead of waiting forever for a target\n\
869to finish a low-level step or continue operation. If the specified amount\n\
85c07804
AC
870of time passes without a response from the target, an error occurs."),
871 NULL,
920d2a44 872 show_watchdog,
85c07804 873 &setlist, &showlist);
4f337972 874
d28f9cdf 875 add_setshow_boolean_cmd ("profile", class_maintenance,
7915a72c
AC
876 &maintenance_profile_p, _("\
877Set internal profiling."), _("\
878Show internal profiling."), _("\
879When enabled GDB is profiled."),
2c5b56ce 880 maintenance_set_profile_cmd,
920d2a44 881 show_maintenance_profile_p,
d28f9cdf
DJ
882 &maintenance_set_cmdlist,
883 &maintenance_show_cmdlist);
c906108c 884}