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