This commit was generated by cvs2svn to track changes on a CVS vendor
[platform/upstream/binutils.git] / gdb / maint.c
1 /* Support for GDB maintenance commands.
2    Copyright 1992, 1993, 1994 Free Software Foundation, Inc.
3    Written by Fred Fish at Cygnus Support.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330,
20    Boston, MA 02111-1307, USA.  */
21
22
23 #include "defs.h"
24 #include <ctype.h>
25 #include <signal.h>
26 #include "command.h"
27 #include "gdbcmd.h"
28 #include "symtab.h"
29 #include "gdbtypes.h"
30 #include "demangle.h"
31 #include "gdbcore.h"
32 #include "expression.h"         /* For language.h */
33 #include "language.h"
34 #include "symfile.h"
35 #include "objfiles.h"
36 #include "value.h"
37
38 extern void _initialize_maint_cmds PARAMS ((void));
39
40 static void maintenance_command PARAMS ((char *, int));
41
42 static void maintenance_dump_me PARAMS ((char *, int));
43
44 static void maintenance_internal_error PARAMS ((char *args, int from_tty));
45
46 static void maintenance_demangle PARAMS ((char *, int));
47
48 static void maintenance_time_display PARAMS ((char *, int));
49
50 static void maintenance_space_display PARAMS ((char *, int));
51
52 static void maintenance_info_command PARAMS ((char *, int));
53
54 static void print_section_table PARAMS ((bfd *, asection *, PTR));
55
56 static void maintenance_info_sections PARAMS ((char *, int));
57
58 static void maintenance_print_command PARAMS ((char *, int));
59
60 /* Set this to the maximum number of seconds to wait instead of waiting forever
61    in target_wait().  If this timer times out, then it generates an error and
62    the command is aborted.  This replaces most of the need for timeouts in the
63    GDB test suite, and makes it possible to distinguish between a hung target
64    and one with slow communications.  */
65
66 int watchdog = 0;
67
68 /*
69
70    LOCAL FUNCTION
71
72    maintenance_command -- access the maintenance subcommands
73
74    SYNOPSIS
75
76    void maintenance_command (char *args, int from_tty)
77
78    DESCRIPTION
79
80  */
81
82 static void
83 maintenance_command (args, from_tty)
84      char *args;
85      int from_tty;
86 {
87   printf_unfiltered ("\"maintenance\" must be followed by the name of a maintenance command.\n");
88   help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
89 }
90
91 #ifndef _WIN32
92 /* ARGSUSED */
93 static void
94 maintenance_dump_me (args, from_tty)
95      char *args;
96      int from_tty;
97 {
98   if (query ("Should GDB dump core? "))
99     {
100 #ifdef __DJGPP__
101       /* SIGQUIT by default is ignored, so use SIGABRT instead.  */
102       signal (SIGABRT, SIG_DFL);
103       kill (getpid (), SIGABRT);
104 #else
105       signal (SIGQUIT, SIG_DFL);
106       kill (getpid (), SIGQUIT);
107 #endif
108     }
109 }
110 #endif
111
112 /* Stimulate the internal error mechanism that GDB uses when an
113    internal problem is detected.  Allows testing of the mechanism.
114    Also useful when the user wants to drop a core file but not exit
115    GDB. */
116
117 static void
118 maintenance_internal_error (char *args, int from_tty)
119 {
120   internal_error ("internal maintenance");
121 }
122
123 /*  Someday we should allow demangling for things other than just
124    explicit strings.  For example, we might want to be able to
125    specify the address of a string in either GDB's process space
126    or the debuggee's process space, and have gdb fetch and demangle
127    that string.  If we have a char* pointer "ptr" that points to
128    a string, we might want to be able to given just the name and
129    have GDB demangle and print what it points to, etc.  (FIXME) */
130
131 static void
132 maintenance_demangle (args, from_tty)
133      char *args;
134      int from_tty;
135 {
136   char *demangled;
137
138   if (args == NULL || *args == '\0')
139     {
140       printf_unfiltered ("\"maintenance demangle\" takes an argument to demangle.\n");
141     }
142   else
143     {
144       demangled = cplus_demangle (args, DMGL_ANSI | DMGL_PARAMS);
145       if (demangled != NULL)
146         {
147           printf_unfiltered ("%s\n", demangled);
148           free (demangled);
149         }
150       else
151         {
152           printf_unfiltered ("Can't demangle \"%s\"\n", args);
153         }
154     }
155 }
156
157 static void
158 maintenance_time_display (args, from_tty)
159      char *args;
160      int from_tty;
161 {
162   extern int display_time;
163
164   if (args == NULL || *args == '\0')
165     printf_unfiltered ("\"maintenance time\" takes a numeric argument.\n");
166   else
167     display_time = strtol (args, NULL, 10);
168 }
169
170 static void
171 maintenance_space_display (args, from_tty)
172      char *args;
173      int from_tty;
174 {
175   extern int display_space;
176
177   if (args == NULL || *args == '\0')
178     printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
179   else
180     display_space = strtol (args, NULL, 10);
181 }
182
183 /* The "maintenance info" command is defined as a prefix, with allow_unknown 0.
184    Therefore, its own definition is called only for "maintenance info" with
185    no args.  */
186
187 /* ARGSUSED */
188 static void
189 maintenance_info_command (arg, from_tty)
190      char *arg;
191      int from_tty;
192 {
193   printf_unfiltered ("\"maintenance info\" must be followed by the name of an info command.\n");
194   help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
195 }
196
197 static void
198 print_section_table (abfd, asect, ignore)
199      bfd *abfd;
200      asection *asect;
201      PTR ignore;
202 {
203   flagword flags;
204
205   flags = bfd_get_section_flags (abfd, asect);
206
207   /* FIXME-32x64: Need print_address_numeric with field width.  */
208   printf_filtered ("    %s",
209                    local_hex_string_custom
210                    ((unsigned long) bfd_section_vma (abfd, asect), "08l"));
211   printf_filtered ("->%s",
212                    local_hex_string_custom
213                    ((unsigned long) (bfd_section_vma (abfd, asect)
214                                      + bfd_section_size (abfd, asect)),
215                     "08l"));
216   printf_filtered (" at %s",
217                    local_hex_string_custom
218                    ((unsigned long) asect->filepos, "08l"));
219   printf_filtered (": %s", bfd_section_name (abfd, asect));
220
221   if (flags & SEC_ALLOC)
222     printf_filtered (" ALLOC");
223   if (flags & SEC_LOAD)
224     printf_filtered (" LOAD");
225   if (flags & SEC_RELOC)
226     printf_filtered (" RELOC");
227   if (flags & SEC_READONLY)
228     printf_filtered (" READONLY");
229   if (flags & SEC_CODE)
230     printf_filtered (" CODE");
231   if (flags & SEC_DATA)
232     printf_filtered (" DATA");
233   if (flags & SEC_ROM)
234     printf_filtered (" ROM");
235   if (flags & SEC_CONSTRUCTOR)
236     printf_filtered (" CONSTRUCTOR");
237   if (flags & SEC_HAS_CONTENTS)
238     printf_filtered (" HAS_CONTENTS");
239   if (flags & SEC_NEVER_LOAD)
240     printf_filtered (" NEVER_LOAD");
241   if (flags & SEC_COFF_SHARED_LIBRARY)
242     printf_filtered (" COFF_SHARED_LIBRARY");
243   if (flags & SEC_IS_COMMON)
244     printf_filtered (" IS_COMMON");
245
246   printf_filtered ("\n");
247 }
248
249 /* ARGSUSED */
250 static void
251 maintenance_info_sections (arg, from_tty)
252      char *arg;
253      int from_tty;
254 {
255   if (exec_bfd)
256     {
257       printf_filtered ("Exec file:\n");
258       printf_filtered ("    `%s', ", bfd_get_filename (exec_bfd));
259       wrap_here ("        ");
260       printf_filtered ("file type %s.\n", bfd_get_target (exec_bfd));
261       bfd_map_over_sections (exec_bfd, print_section_table, 0);
262     }
263
264   if (core_bfd)
265     {
266       printf_filtered ("Core file:\n");
267       printf_filtered ("    `%s', ", bfd_get_filename (core_bfd));
268       wrap_here ("        ");
269       printf_filtered ("file type %s.\n", bfd_get_target (core_bfd));
270       bfd_map_over_sections (core_bfd, print_section_table, 0);
271     }
272 }
273
274 /* ARGSUSED */
275 void
276 maintenance_print_statistics (args, from_tty)
277      char *args;
278      int from_tty;
279 {
280   print_objfile_statistics ();
281   print_symbol_bcache_statistics ();
282 }
283
284 /* The "maintenance print" command is defined as a prefix, with allow_unknown
285    0.  Therefore, its own definition is called only for "maintenance print"
286    with no args.  */
287
288 /* ARGSUSED */
289 static void
290 maintenance_print_command (arg, from_tty)
291      char *arg;
292      int from_tty;
293 {
294   printf_unfiltered ("\"maintenance print\" must be followed by the name of a print command.\n");
295   help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
296 }
297
298 /* The "maintenance translate-address" command converts a section and address
299    to a symbol.  This can be called in two ways:
300    maintenance translate-address <secname> <addr>
301    or   maintenance translate-address <addr>
302  */
303
304 static void
305 maintenance_translate_address (arg, from_tty)
306      char *arg;
307      int from_tty;
308 {
309   CORE_ADDR address;
310   asection *sect;
311   char *p;
312   struct minimal_symbol *sym;
313   struct objfile *objfile;
314
315   if (arg == NULL || *arg == 0)
316     error ("requires argument (address or section + address)");
317
318   sect = NULL;
319   p = arg;
320
321   if (!isdigit (*p))
322     {                           /* See if we have a valid section name */
323       while (*p && !isspace (*p))       /* Find end of section name */
324         p++;
325       if (*p == '\000')         /* End of command? */
326         error ("Need to specify <section-name> and <address>");
327       *p++ = '\000';
328       while (isspace (*p))
329         p++;                    /* Skip whitespace */
330
331       ALL_OBJFILES (objfile)
332       {
333         sect = bfd_get_section_by_name (objfile->obfd, arg);
334         if (sect != NULL)
335           break;
336       }
337
338       if (!sect)
339         error ("Unknown section %s.", arg);
340     }
341
342   address = parse_and_eval_address (p);
343
344   if (sect)
345     sym = lookup_minimal_symbol_by_pc_section (address, sect);
346   else
347     sym = lookup_minimal_symbol_by_pc (address);
348
349   if (sym)
350     printf_filtered ("%s+%s\n",
351                      SYMBOL_SOURCE_NAME (sym),
352                      paddr_u (address - SYMBOL_VALUE_ADDRESS (sym)));
353   else if (sect)
354     printf_filtered ("no symbol at %s:0x%s\n", sect->name, paddr (address));
355   else
356     printf_filtered ("no symbol at 0x%s\n", paddr (address));
357
358   return;
359 }
360
361 void
362 _initialize_maint_cmds ()
363 {
364   add_prefix_cmd ("maintenance", class_maintenance, maintenance_command,
365                   "Commands for use by GDB maintainers.\n\
366 Includes commands to dump specific internal GDB structures in\n\
367 a human readable form, to cause GDB to deliberately dump core,\n\
368 to test internal functions such as the C++ demangler, etc.",
369                   &maintenancelist, "maintenance ", 0,
370                   &cmdlist);
371
372   add_com_alias ("mt", "maintenance", class_maintenance, 1);
373
374   add_prefix_cmd ("info", class_maintenance, maintenance_info_command,
375      "Commands for showing internal info about the program being debugged.",
376                   &maintenanceinfolist, "maintenance info ", 0,
377                   &maintenancelist);
378
379   add_cmd ("sections", class_maintenance, maintenance_info_sections,
380            "List the BFD sections of the exec and core files.",
381            &maintenanceinfolist);
382
383   add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
384                   "Maintenance command for printing GDB internal state.",
385                   &maintenanceprintlist, "maintenance print ", 0,
386                   &maintenancelist);
387
388 #ifndef _WIN32
389   add_cmd ("dump-me", class_maintenance, maintenance_dump_me,
390            "Get fatal error; make debugger dump its core.\n\
391 GDB sets it's handling of SIGQUIT back to SIG_DFL and then sends\n\
392 itself a SIGQUIT signal.",
393            &maintenancelist);
394 #endif
395
396   add_cmd ("internal-error", class_maintenance, maintenance_internal_error,
397            "Give GDB an internal error.\n\
398 Cause GDB to behave as if an internal error was detected.",
399            &maintenancelist);
400
401   add_cmd ("demangle", class_maintenance, maintenance_demangle,
402            "Demangle a C++ mangled name.\n\
403 Call internal GDB demangler routine to demangle a C++ link name\n\
404 and prints the result.",
405            &maintenancelist);
406
407   add_cmd ("time", class_maintenance, maintenance_time_display,
408            "Set the display of time usage.\n\
409 If nonzero, will cause the execution time for each command to be\n\
410 displayed, following the command's output.",
411            &maintenancelist);
412
413   add_cmd ("space", class_maintenance, maintenance_space_display,
414            "Set the display of space usage.\n\
415 If nonzero, will cause the execution space for each command to be\n\
416 displayed, following the command's output.",
417            &maintenancelist);
418
419   add_cmd ("type", class_maintenance, maintenance_print_type,
420            "Print a type chain for a given symbol.\n\
421 For each node in a type chain, print the raw data for each member of\n\
422 the type structure, and the interpretation of the data.",
423            &maintenanceprintlist);
424
425   add_cmd ("symbols", class_maintenance, maintenance_print_symbols,
426            "Print dump of current symbol definitions.\n\
427 Entries in the full symbol table are dumped to file OUTFILE.\n\
428 If a SOURCE file is specified, dump only that file's symbols.",
429            &maintenanceprintlist);
430
431   add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols,
432            "Print dump of current minimal symbol definitions.\n\
433 Entries in the minimal symbol table are dumped to file OUTFILE.\n\
434 If a SOURCE file is specified, dump only that file's minimal symbols.",
435            &maintenanceprintlist);
436
437   add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols,
438            "Print dump of current partial symbol definitions.\n\
439 Entries in the partial symbol table are dumped to file OUTFILE.\n\
440 If a SOURCE file is specified, dump only that file's partial symbols.",
441            &maintenanceprintlist);
442
443   add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
444            "Print dump of current object file definitions.",
445            &maintenanceprintlist);
446
447   add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
448            "Print statistics about internal gdb state.",
449            &maintenanceprintlist);
450
451   add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
452            "Check consistency of psymtabs and symtabs.",
453            &maintenancelist);
454
455   add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
456            "Translate a section name and address to a symbol.",
457            &maintenancelist);
458
459   add_show_from_set (
460                       add_set_cmd ("watchdog", class_maintenance, var_zinteger, (char *) &watchdog,
461                                    "Set watchdog timer.\n\
462 When non-zero, this timeout is used instead of waiting forever for a target to\n\
463 finish a low-level step or continue operation.  If the specified amount of time\n\
464 passes without a response from the target, an error occurs.", &setlist),
465                       &showlist);
466 }