Commit | Line | Data |
---|---|---|
c906108c | 1 | /* Support for GDB maintenance commands. |
b6ba6518 KB |
2 | Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001 |
3 | Free Software Foundation, Inc. | |
c906108c SS |
4 | Written by Fred Fish at Cygnus Support. |
5 | ||
c5aa993b | 6 | This file is part of GDB. |
c906108c | 7 | |
c5aa993b JM |
8 | This program is free software; you can redistribute it and/or modify |
9 | it under the terms of the GNU General Public License as published by | |
10 | the Free Software Foundation; either version 2 of the License, or | |
11 | (at your option) any later version. | |
c906108c | 12 | |
c5aa993b JM |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
c906108c | 17 | |
c5aa993b JM |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software | |
20 | Foundation, Inc., 59 Temple Place - Suite 330, | |
21 | Boston, MA 02111-1307, USA. */ | |
c906108c SS |
22 | |
23 | ||
24 | #include "defs.h" | |
c906108c SS |
25 | #include <ctype.h> |
26 | #include <signal.h> | |
27 | #include "command.h" | |
28 | #include "gdbcmd.h" | |
29 | #include "symtab.h" | |
30 | #include "gdbtypes.h" | |
31 | #include "demangle.h" | |
32 | #include "gdbcore.h" | |
c5aa993b | 33 | #include "expression.h" /* For language.h */ |
c906108c SS |
34 | #include "language.h" |
35 | #include "symfile.h" | |
36 | #include "objfiles.h" | |
37 | #include "value.h" | |
38 | ||
a14ed312 | 39 | extern void _initialize_maint_cmds (void); |
392a587b | 40 | |
a14ed312 | 41 | static void maintenance_command (char *, int); |
c906108c | 42 | |
a14ed312 | 43 | static void maintenance_dump_me (char *, int); |
c906108c | 44 | |
a14ed312 | 45 | static void maintenance_internal_error (char *args, int from_tty); |
7be570e7 | 46 | |
a14ed312 | 47 | static void maintenance_demangle (char *, int); |
c906108c | 48 | |
a14ed312 | 49 | static void maintenance_time_display (char *, int); |
c906108c | 50 | |
a14ed312 | 51 | static void maintenance_space_display (char *, int); |
c906108c | 52 | |
a14ed312 | 53 | static void maintenance_info_command (char *, int); |
c906108c | 54 | |
a14ed312 | 55 | static void print_section_table (bfd *, asection *, PTR); |
c906108c | 56 | |
a14ed312 | 57 | static void maintenance_info_sections (char *, int); |
c906108c | 58 | |
a14ed312 | 59 | static void maintenance_print_command (char *, int); |
c906108c | 60 | |
1c689132 DB |
61 | static 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 | ||
69 | int watchdog = 0; | |
70 | ||
71 | /* | |
72 | ||
c5aa993b | 73 | LOCAL FUNCTION |
c906108c | 74 | |
c5aa993b | 75 | maintenance_command -- access the maintenance subcommands |
c906108c | 76 | |
c5aa993b | 77 | SYNOPSIS |
c906108c | 78 | |
c5aa993b | 79 | void maintenance_command (char *args, int from_tty) |
c906108c | 80 | |
c5aa993b | 81 | DESCRIPTION |
c906108c | 82 | |
c5aa993b | 83 | */ |
c906108c SS |
84 | |
85 | static void | |
fba45db2 | 86 | maintenance_command (char *args, int from_tty) |
c906108c SS |
87 | { |
88 | printf_unfiltered ("\"maintenance\" must be followed by the name of a maintenance command.\n"); | |
89 | help_list (maintenancelist, "maintenance ", -1, gdb_stdout); | |
90 | } | |
91 | ||
92 | #ifndef _WIN32 | |
93 | /* ARGSUSED */ | |
94 | static void | |
fba45db2 | 95 | maintenance_dump_me (char *args, int from_tty) |
c906108c SS |
96 | { |
97 | if (query ("Should GDB dump core? ")) | |
98 | { | |
7be570e7 JM |
99 | #ifdef __DJGPP__ |
100 | /* SIGQUIT by default is ignored, so use SIGABRT instead. */ | |
101 | signal (SIGABRT, SIG_DFL); | |
102 | kill (getpid (), SIGABRT); | |
103 | #else | |
c906108c SS |
104 | signal (SIGQUIT, SIG_DFL); |
105 | kill (getpid (), SIGQUIT); | |
7be570e7 | 106 | #endif |
c906108c SS |
107 | } |
108 | } | |
109 | #endif | |
110 | ||
7be570e7 JM |
111 | /* Stimulate the internal error mechanism that GDB uses when an |
112 | internal problem is detected. Allows testing of the mechanism. | |
113 | Also useful when the user wants to drop a core file but not exit | |
114 | GDB. */ | |
115 | ||
116 | static void | |
117 | maintenance_internal_error (char *args, int from_tty) | |
118 | { | |
8e65ff28 AC |
119 | internal_error (__FILE__, __LINE__, |
120 | "internal maintenance"); | |
7be570e7 JM |
121 | } |
122 | ||
33f91161 AC |
123 | /* Someday we should allow demangling for things other than just |
124 | explicit strings. For example, we might want to be able to specify | |
125 | the address of a string in either GDB's process space or the | |
126 | debuggee's process space, and have gdb fetch and demangle that | |
127 | string. If we have a char* pointer "ptr" that points to a string, | |
128 | we might want to be able to given just the name and have GDB | |
129 | demangle and print what it points to, etc. (FIXME) */ | |
c906108c SS |
130 | |
131 | static void | |
fba45db2 | 132 | maintenance_demangle (char *args, int from_tty) |
c906108c SS |
133 | { |
134 | char *demangled; | |
135 | ||
136 | if (args == NULL || *args == '\0') | |
137 | { | |
138 | printf_unfiltered ("\"maintenance demangle\" takes an argument to demangle.\n"); | |
139 | } | |
140 | else | |
141 | { | |
142 | demangled = cplus_demangle (args, DMGL_ANSI | DMGL_PARAMS); | |
143 | if (demangled != NULL) | |
144 | { | |
145 | printf_unfiltered ("%s\n", demangled); | |
b8c9b27d | 146 | xfree (demangled); |
c906108c SS |
147 | } |
148 | else | |
149 | { | |
150 | printf_unfiltered ("Can't demangle \"%s\"\n", args); | |
151 | } | |
152 | } | |
153 | } | |
154 | ||
155 | static void | |
fba45db2 | 156 | maintenance_time_display (char *args, int from_tty) |
c906108c SS |
157 | { |
158 | extern int display_time; | |
159 | ||
160 | if (args == NULL || *args == '\0') | |
161 | printf_unfiltered ("\"maintenance time\" takes a numeric argument.\n"); | |
162 | else | |
163 | display_time = strtol (args, NULL, 10); | |
164 | } | |
165 | ||
166 | static void | |
fba45db2 | 167 | maintenance_space_display (char *args, int from_tty) |
c906108c SS |
168 | { |
169 | extern int display_space; | |
170 | ||
171 | if (args == NULL || *args == '\0') | |
172 | printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n"); | |
173 | else | |
174 | display_space = strtol (args, NULL, 10); | |
175 | } | |
176 | ||
33f91161 AC |
177 | /* The "maintenance info" command is defined as a prefix, with |
178 | allow_unknown 0. Therefore, its own definition is called only for | |
179 | "maintenance info" with no args. */ | |
c906108c SS |
180 | |
181 | /* ARGSUSED */ | |
182 | static void | |
fba45db2 | 183 | maintenance_info_command (char *arg, int from_tty) |
c906108c SS |
184 | { |
185 | printf_unfiltered ("\"maintenance info\" must be followed by the name of an info command.\n"); | |
186 | help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout); | |
187 | } | |
188 | ||
189 | static void | |
fba45db2 | 190 | print_section_table (bfd *abfd, asection *asect, PTR ignore) |
c906108c SS |
191 | { |
192 | flagword flags; | |
193 | ||
194 | flags = bfd_get_section_flags (abfd, asect); | |
195 | ||
196 | /* FIXME-32x64: Need print_address_numeric with field width. */ | |
197 | printf_filtered (" %s", | |
198 | local_hex_string_custom | |
c5aa993b | 199 | ((unsigned long) bfd_section_vma (abfd, asect), "08l")); |
c906108c SS |
200 | printf_filtered ("->%s", |
201 | local_hex_string_custom | |
c5aa993b JM |
202 | ((unsigned long) (bfd_section_vma (abfd, asect) |
203 | + bfd_section_size (abfd, asect)), | |
204 | "08l")); | |
c906108c SS |
205 | printf_filtered (" at %s", |
206 | local_hex_string_custom | |
c5aa993b | 207 | ((unsigned long) asect->filepos, "08l")); |
c906108c SS |
208 | printf_filtered (": %s", bfd_section_name (abfd, asect)); |
209 | ||
210 | if (flags & SEC_ALLOC) | |
211 | printf_filtered (" ALLOC"); | |
212 | if (flags & SEC_LOAD) | |
213 | printf_filtered (" LOAD"); | |
214 | if (flags & SEC_RELOC) | |
215 | printf_filtered (" RELOC"); | |
216 | if (flags & SEC_READONLY) | |
217 | printf_filtered (" READONLY"); | |
218 | if (flags & SEC_CODE) | |
219 | printf_filtered (" CODE"); | |
220 | if (flags & SEC_DATA) | |
221 | printf_filtered (" DATA"); | |
222 | if (flags & SEC_ROM) | |
223 | printf_filtered (" ROM"); | |
224 | if (flags & SEC_CONSTRUCTOR) | |
225 | printf_filtered (" CONSTRUCTOR"); | |
226 | if (flags & SEC_HAS_CONTENTS) | |
227 | printf_filtered (" HAS_CONTENTS"); | |
228 | if (flags & SEC_NEVER_LOAD) | |
229 | printf_filtered (" NEVER_LOAD"); | |
230 | if (flags & SEC_COFF_SHARED_LIBRARY) | |
231 | printf_filtered (" COFF_SHARED_LIBRARY"); | |
232 | if (flags & SEC_IS_COMMON) | |
233 | printf_filtered (" IS_COMMON"); | |
234 | ||
235 | printf_filtered ("\n"); | |
236 | } | |
237 | ||
238 | /* ARGSUSED */ | |
239 | static void | |
fba45db2 | 240 | maintenance_info_sections (char *arg, int from_tty) |
c906108c SS |
241 | { |
242 | if (exec_bfd) | |
243 | { | |
244 | printf_filtered ("Exec file:\n"); | |
c5aa993b | 245 | printf_filtered (" `%s', ", bfd_get_filename (exec_bfd)); |
c906108c | 246 | wrap_here (" "); |
c5aa993b JM |
247 | printf_filtered ("file type %s.\n", bfd_get_target (exec_bfd)); |
248 | bfd_map_over_sections (exec_bfd, print_section_table, 0); | |
c906108c SS |
249 | } |
250 | ||
251 | if (core_bfd) | |
252 | { | |
253 | printf_filtered ("Core file:\n"); | |
c5aa993b | 254 | printf_filtered (" `%s', ", bfd_get_filename (core_bfd)); |
c906108c | 255 | wrap_here (" "); |
c5aa993b JM |
256 | printf_filtered ("file type %s.\n", bfd_get_target (core_bfd)); |
257 | bfd_map_over_sections (core_bfd, print_section_table, 0); | |
c906108c SS |
258 | } |
259 | } | |
260 | ||
261 | /* ARGSUSED */ | |
262 | void | |
fba45db2 | 263 | maintenance_print_statistics (char *args, int from_tty) |
c906108c SS |
264 | { |
265 | print_objfile_statistics (); | |
266 | print_symbol_bcache_statistics (); | |
267 | } | |
268 | ||
4b9b3959 AC |
269 | void |
270 | maintenance_print_architecture (char *args, int from_tty) | |
271 | { | |
272 | if (args == NULL) | |
273 | gdbarch_dump (current_gdbarch, gdb_stdout); | |
274 | else | |
275 | { | |
276 | struct ui_file *file = gdb_fopen (args, "w"); | |
277 | if (file == NULL) | |
278 | perror_with_name ("maintenance print architecture"); | |
279 | gdbarch_dump (current_gdbarch, file); | |
280 | ui_file_delete (file); | |
281 | } | |
282 | } | |
283 | ||
33f91161 AC |
284 | /* The "maintenance print" command is defined as a prefix, with |
285 | allow_unknown 0. Therefore, its own definition is called only for | |
286 | "maintenance print" with no args. */ | |
c906108c SS |
287 | |
288 | /* ARGSUSED */ | |
289 | static void | |
fba45db2 | 290 | maintenance_print_command (char *arg, int from_tty) |
c906108c SS |
291 | { |
292 | printf_unfiltered ("\"maintenance print\" must be followed by the name of a print command.\n"); | |
293 | help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout); | |
294 | } | |
295 | ||
296 | /* The "maintenance translate-address" command converts a section and address | |
297 | to a symbol. This can be called in two ways: | |
c5aa993b JM |
298 | maintenance translate-address <secname> <addr> |
299 | or maintenance translate-address <addr> | |
300 | */ | |
c906108c SS |
301 | |
302 | static void | |
fba45db2 | 303 | maintenance_translate_address (char *arg, int from_tty) |
c906108c SS |
304 | { |
305 | CORE_ADDR address; | |
306 | asection *sect; | |
307 | char *p; | |
308 | struct minimal_symbol *sym; | |
309 | struct objfile *objfile; | |
310 | ||
311 | if (arg == NULL || *arg == 0) | |
312 | error ("requires argument (address or section + address)"); | |
313 | ||
314 | sect = NULL; | |
315 | p = arg; | |
316 | ||
317 | if (!isdigit (*p)) | |
318 | { /* See if we have a valid section name */ | |
c5aa993b | 319 | while (*p && !isspace (*p)) /* Find end of section name */ |
c906108c SS |
320 | p++; |
321 | if (*p == '\000') /* End of command? */ | |
322 | error ("Need to specify <section-name> and <address>"); | |
323 | *p++ = '\000'; | |
c5aa993b JM |
324 | while (isspace (*p)) |
325 | p++; /* Skip whitespace */ | |
c906108c SS |
326 | |
327 | ALL_OBJFILES (objfile) | |
c5aa993b JM |
328 | { |
329 | sect = bfd_get_section_by_name (objfile->obfd, arg); | |
330 | if (sect != NULL) | |
331 | break; | |
332 | } | |
c906108c SS |
333 | |
334 | if (!sect) | |
335 | error ("Unknown section %s.", arg); | |
336 | } | |
337 | ||
338 | address = parse_and_eval_address (p); | |
339 | ||
340 | if (sect) | |
341 | sym = lookup_minimal_symbol_by_pc_section (address, sect); | |
342 | else | |
343 | sym = lookup_minimal_symbol_by_pc (address); | |
344 | ||
345 | if (sym) | |
d4f3574e | 346 | printf_filtered ("%s+%s\n", |
c5aa993b | 347 | SYMBOL_SOURCE_NAME (sym), |
d4f3574e | 348 | paddr_u (address - SYMBOL_VALUE_ADDRESS (sym))); |
c906108c | 349 | else if (sect) |
d4f3574e | 350 | printf_filtered ("no symbol at %s:0x%s\n", sect->name, paddr (address)); |
c906108c | 351 | else |
d4f3574e | 352 | printf_filtered ("no symbol at 0x%s\n", paddr (address)); |
c906108c SS |
353 | |
354 | return; | |
355 | } | |
356 | ||
56382845 | 357 | |
c114dcd5 | 358 | /* When a command is deprecated the user will be warned the first time |
33f91161 AC |
359 | the command is used. If possible, a replacement will be |
360 | offered. */ | |
56382845 FN |
361 | |
362 | static void | |
363 | maintenance_deprecate (char *args, int from_tty) | |
364 | { | |
365 | if (args == NULL || *args == '\0') | |
366 | { | |
367 | printf_unfiltered ("\"maintenance deprecate\" takes an argument, \n\ | |
368 | the command you want to deprecate, and optionally the replacement command \n\ | |
369 | enclosed in quotes.\n"); | |
370 | } | |
33f91161 | 371 | |
56382845 FN |
372 | maintenance_do_deprecate (args, 1); |
373 | ||
374 | } | |
375 | ||
376 | ||
377 | static void | |
378 | maintenance_undeprecate (char *args, int from_tty) | |
379 | { | |
380 | if (args == NULL || *args == '\0') | |
381 | { | |
382 | printf_unfiltered ("\"maintenance undeprecate\" takes an argument, \n\ | |
383 | the command you want to undeprecate.\n"); | |
384 | } | |
33f91161 | 385 | |
56382845 | 386 | maintenance_do_deprecate (args, 0); |
33f91161 | 387 | |
56382845 FN |
388 | } |
389 | ||
33f91161 AC |
390 | /* You really shouldn't be using this. It is just for the testsuite. |
391 | Rather, you should use deprecate_cmd() when the command is created | |
392 | in _initialize_blah(). | |
393 | ||
394 | This function deprecates a command and optionally assigns it a | |
395 | replacement. */ | |
396 | ||
8399535b | 397 | static void |
33f91161 AC |
398 | maintenance_do_deprecate (char *text, int deprecate) |
399 | { | |
400 | ||
401 | struct cmd_list_element *alias = NULL; | |
402 | struct cmd_list_element *prefix_cmd = NULL; | |
403 | struct cmd_list_element *cmd = NULL; | |
404 | ||
405 | char *start_ptr = NULL; | |
406 | char *end_ptr = NULL; | |
56382845 | 407 | int len; |
33f91161 AC |
408 | char *replacement = NULL; |
409 | ||
1c689132 DB |
410 | if (text == NULL) |
411 | return; | |
56382845 | 412 | |
33f91161 AC |
413 | if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd)) |
414 | { | |
415 | printf_filtered ("Can't find command '%s' to deprecate.\n", text); | |
416 | return; | |
417 | } | |
56382845 | 418 | |
56382845 FN |
419 | if (deprecate) |
420 | { | |
421 | /* look for a replacement command */ | |
80ce1ecb AC |
422 | start_ptr = strchr (text, '\"'); |
423 | if (start_ptr != NULL) | |
33f91161 AC |
424 | { |
425 | start_ptr++; | |
80ce1ecb AC |
426 | end_ptr = strrchr (start_ptr, '\"'); |
427 | if (end_ptr != NULL) | |
33f91161 AC |
428 | { |
429 | len = end_ptr - start_ptr; | |
430 | start_ptr[len] = '\0'; | |
431 | replacement = xstrdup (start_ptr); | |
432 | } | |
433 | } | |
56382845 | 434 | } |
33f91161 | 435 | |
56382845 FN |
436 | if (!start_ptr || !end_ptr) |
437 | replacement = NULL; | |
33f91161 AC |
438 | |
439 | ||
56382845 | 440 | /* If they used an alias, we only want to deprecate the alias. |
33f91161 | 441 | |
56382845 FN |
442 | Note the MALLOCED_REPLACEMENT test. If the command's replacement |
443 | string was allocated at compile time we don't want to free the | |
33f91161 | 444 | memory. */ |
56382845 FN |
445 | if (alias) |
446 | { | |
33f91161 | 447 | |
56382845 | 448 | if (alias->flags & MALLOCED_REPLACEMENT) |
b8c9b27d | 449 | xfree (alias->replacement); |
33f91161 | 450 | |
56382845 | 451 | if (deprecate) |
33f91161 | 452 | alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED); |
56382845 | 453 | else |
33f91161 AC |
454 | alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED); |
455 | alias->replacement = replacement; | |
56382845 FN |
456 | alias->flags |= MALLOCED_REPLACEMENT; |
457 | return; | |
458 | } | |
459 | else if (cmd) | |
460 | { | |
461 | if (cmd->flags & MALLOCED_REPLACEMENT) | |
b8c9b27d | 462 | xfree (cmd->replacement); |
56382845 FN |
463 | |
464 | if (deprecate) | |
33f91161 | 465 | cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED); |
56382845 | 466 | else |
33f91161 AC |
467 | cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED); |
468 | cmd->replacement = replacement; | |
56382845 FN |
469 | cmd->flags |= MALLOCED_REPLACEMENT; |
470 | return; | |
471 | } | |
472 | } | |
473 | ||
4f337972 AC |
474 | /* Maintenance set/show framework. */ |
475 | ||
476 | static struct cmd_list_element *maintenance_set_cmdlist; | |
477 | static struct cmd_list_element *maintenance_show_cmdlist; | |
478 | ||
479 | static void | |
480 | maintenance_set_cmd (char *args, int from_tty) | |
481 | { | |
482 | printf_unfiltered ("\"maintenance set\" must be followed by the name of a set command.\n"); | |
483 | help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout); | |
484 | } | |
485 | ||
486 | static void | |
487 | maintenance_show_cmd (char *args, int from_tty) | |
488 | { | |
489 | cmd_show_list (maintenance_show_cmdlist, from_tty, ""); | |
490 | } | |
491 | ||
492 | #ifdef NOTYET | |
493 | /* Profiling support. */ | |
494 | ||
495 | static int maintenance_profile_p; | |
496 | ||
497 | static void | |
498 | maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c) | |
499 | { | |
500 | maintenance_profile_p = 0; | |
501 | warning ("\"maintenance set profile\" command not supported.\n"); | |
502 | } | |
503 | #endif | |
56382845 | 504 | |
c906108c | 505 | void |
fba45db2 | 506 | _initialize_maint_cmds (void) |
c906108c | 507 | { |
4f337972 AC |
508 | struct cmd_list_element *tmpcmd; |
509 | ||
c906108c SS |
510 | add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, |
511 | "Commands for use by GDB maintainers.\n\ | |
512 | Includes commands to dump specific internal GDB structures in\n\ | |
513 | a human readable form, to cause GDB to deliberately dump core,\n\ | |
514 | to test internal functions such as the C++ demangler, etc.", | |
515 | &maintenancelist, "maintenance ", 0, | |
516 | &cmdlist); | |
517 | ||
518 | add_com_alias ("mt", "maintenance", class_maintenance, 1); | |
519 | ||
520 | add_prefix_cmd ("info", class_maintenance, maintenance_info_command, | |
c5aa993b | 521 | "Commands for showing internal info about the program being debugged.", |
c906108c SS |
522 | &maintenanceinfolist, "maintenance info ", 0, |
523 | &maintenancelist); | |
90515c23 | 524 | add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist); |
c906108c SS |
525 | |
526 | add_cmd ("sections", class_maintenance, maintenance_info_sections, | |
527 | "List the BFD sections of the exec and core files.", | |
528 | &maintenanceinfolist); | |
529 | ||
530 | add_prefix_cmd ("print", class_maintenance, maintenance_print_command, | |
531 | "Maintenance command for printing GDB internal state.", | |
532 | &maintenanceprintlist, "maintenance print ", 0, | |
533 | &maintenancelist); | |
534 | ||
4f337972 AC |
535 | add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, "\ |
536 | Set GDB internal variables used by the GDB maintainer.\n\ | |
537 | Configure variables internal to GDB that aid in GDB's maintenance", | |
538 | &maintenance_set_cmdlist, "maintenance set ", | |
539 | 0/*allow-unknown*/, | |
540 | &maintenancelist); | |
541 | ||
542 | add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, "\ | |
543 | Show GDB internal variables used by the GDB maintainer.\n\ | |
544 | Configure variables internal to GDB that aid in GDB's maintenance", | |
545 | &maintenance_show_cmdlist, "maintenance show ", | |
546 | 0/*allow-unknown*/, | |
547 | &maintenancelist); | |
548 | ||
c906108c SS |
549 | #ifndef _WIN32 |
550 | add_cmd ("dump-me", class_maintenance, maintenance_dump_me, | |
551 | "Get fatal error; make debugger dump its core.\n\ | |
552 | GDB sets it's handling of SIGQUIT back to SIG_DFL and then sends\n\ | |
553 | itself a SIGQUIT signal.", | |
554 | &maintenancelist); | |
555 | #endif | |
556 | ||
7be570e7 JM |
557 | add_cmd ("internal-error", class_maintenance, maintenance_internal_error, |
558 | "Give GDB an internal error.\n\ | |
559 | Cause GDB to behave as if an internal error was detected.", | |
560 | &maintenancelist); | |
561 | ||
c906108c SS |
562 | add_cmd ("demangle", class_maintenance, maintenance_demangle, |
563 | "Demangle a C++ mangled name.\n\ | |
564 | Call internal GDB demangler routine to demangle a C++ link name\n\ | |
565 | and prints the result.", | |
566 | &maintenancelist); | |
567 | ||
568 | add_cmd ("time", class_maintenance, maintenance_time_display, | |
569 | "Set the display of time usage.\n\ | |
570 | If nonzero, will cause the execution time for each command to be\n\ | |
571 | displayed, following the command's output.", | |
572 | &maintenancelist); | |
573 | ||
574 | add_cmd ("space", class_maintenance, maintenance_space_display, | |
575 | "Set the display of space usage.\n\ | |
576 | If nonzero, will cause the execution space for each command to be\n\ | |
577 | displayed, following the command's output.", | |
578 | &maintenancelist); | |
579 | ||
580 | add_cmd ("type", class_maintenance, maintenance_print_type, | |
581 | "Print a type chain for a given symbol.\n\ | |
582 | For each node in a type chain, print the raw data for each member of\n\ | |
583 | the type structure, and the interpretation of the data.", | |
584 | &maintenanceprintlist); | |
585 | ||
586 | add_cmd ("symbols", class_maintenance, maintenance_print_symbols, | |
587 | "Print dump of current symbol definitions.\n\ | |
588 | Entries in the full symbol table are dumped to file OUTFILE.\n\ | |
589 | If a SOURCE file is specified, dump only that file's symbols.", | |
590 | &maintenanceprintlist); | |
591 | ||
592 | add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, | |
593 | "Print dump of current minimal symbol definitions.\n\ | |
594 | Entries in the minimal symbol table are dumped to file OUTFILE.\n\ | |
595 | If a SOURCE file is specified, dump only that file's minimal symbols.", | |
596 | &maintenanceprintlist); | |
597 | ||
598 | add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols, | |
599 | "Print dump of current partial symbol definitions.\n\ | |
600 | Entries in the partial symbol table are dumped to file OUTFILE.\n\ | |
601 | If a SOURCE file is specified, dump only that file's partial symbols.", | |
602 | &maintenanceprintlist); | |
603 | ||
604 | add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles, | |
605 | "Print dump of current object file definitions.", | |
606 | &maintenanceprintlist); | |
607 | ||
608 | add_cmd ("statistics", class_maintenance, maintenance_print_statistics, | |
609 | "Print statistics about internal gdb state.", | |
610 | &maintenanceprintlist); | |
611 | ||
4b9b3959 AC |
612 | add_cmd ("architecture", class_maintenance, maintenance_print_architecture, |
613 | "Print the internal architecture configuration.\ | |
614 | Takes an optional file parameter.", | |
615 | &maintenanceprintlist); | |
616 | ||
c906108c SS |
617 | add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs, |
618 | "Check consistency of psymtabs and symtabs.", | |
619 | &maintenancelist); | |
620 | ||
621 | add_cmd ("translate-address", class_maintenance, maintenance_translate_address, | |
622 | "Translate a section name and address to a symbol.", | |
623 | &maintenancelist); | |
624 | ||
56382845 | 625 | add_cmd ("deprecate", class_maintenance, maintenance_deprecate, |
33f91161 | 626 | "Deprecate a command. Note that this is just in here so the \n\ |
56382845 FN |
627 | testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ |
628 | rather you should use the C function deprecate_cmd(). If you decide you \n\ | |
6f122dc9 | 629 | want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\ |
56382845 FN |
630 | replacement is optional.", &maintenancelist); |
631 | ||
632 | add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, | |
33f91161 | 633 | "Undeprecate a command. Note that this is just in here so the \n\ |
56382845 | 634 | testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ |
33f91161 AC |
635 | If you decide you want to use it: maintenance undeprecate 'commandname'", |
636 | &maintenancelist); | |
56382845 | 637 | |
c906108c | 638 | add_show_from_set ( |
c5aa993b JM |
639 | add_set_cmd ("watchdog", class_maintenance, var_zinteger, (char *) &watchdog, |
640 | "Set watchdog timer.\n\ | |
c906108c SS |
641 | When non-zero, this timeout is used instead of waiting forever for a target to\n\ |
642 | finish a low-level step or continue operation. If the specified amount of time\n\ | |
643 | passes without a response from the target, an error occurs.", &setlist), | |
c5aa993b | 644 | &showlist); |
4f337972 AC |
645 | |
646 | ||
647 | #ifdef NOTYET | |
648 | /* FIXME: cagney/2001-09-24: A patch introducing a | |
649 | add_set_boolean_cmd() is pending, the below should probably use | |
650 | it. A patch implementing profiling is pending, this just sets up | |
651 | the framework. */ | |
652 | tmpcmd = add_set_cmd ("profile", class_maintenance, | |
653 | var_boolean, &maintenance_profile_p, | |
654 | "Set internal profiling.\n\ | |
655 | When enabled GDB is profiled.", | |
656 | &maintenance_set_cmdlist); | |
657 | tmpcmd->function.sfunc = maintenance_set_profile_cmd; | |
658 | add_show_from_set (tmpcmd, &maintenance_show_cmdlist); | |
659 | #endif | |
c906108c | 660 | } |