OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [maint.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 104 markom
/* 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
static void maintenance_do_deprecate (char *, int);
61
 
62
/* Set this to the maximum number of seconds to wait instead of waiting forever
63
   in target_wait().  If this timer times out, then it generates an error and
64
   the command is aborted.  This replaces most of the need for timeouts in the
65
   GDB test suite, and makes it possible to distinguish between a hung target
66
   and one with slow communications.  */
67
 
68
int watchdog = 0;
69
 
70
/*
71
 
72
   LOCAL FUNCTION
73
 
74
   maintenance_command -- access the maintenance subcommands
75
 
76
   SYNOPSIS
77
 
78
   void maintenance_command (char *args, int from_tty)
79
 
80
   DESCRIPTION
81
 
82
 */
83
 
84
static void
85
maintenance_command (args, from_tty)
86
     char *args;
87
     int from_tty;
88
{
89
  printf_unfiltered ("\"maintenance\" must be followed by the name of a maintenance command.\n");
90
  help_list (maintenancelist, "maintenance ", -1, gdb_stdout);
91
}
92
 
93
#ifndef _WIN32
94
/* ARGSUSED */
95
static void
96
maintenance_dump_me (args, from_tty)
97
     char *args;
98
     int from_tty;
99
{
100
  if (query ("Should GDB dump core? "))
101
    {
102
#ifdef __DJGPP__
103
      /* SIGQUIT by default is ignored, so use SIGABRT instead.  */
104
      signal (SIGABRT, SIG_DFL);
105
      kill (getpid (), SIGABRT);
106
#else
107
      signal (SIGQUIT, SIG_DFL);
108
      kill (getpid (), SIGQUIT);
109
#endif
110
    }
111
}
112
#endif
113
 
114
/* Stimulate the internal error mechanism that GDB uses when an
115
   internal problem is detected.  Allows testing of the mechanism.
116
   Also useful when the user wants to drop a core file but not exit
117
   GDB. */
118
 
119
static void
120
maintenance_internal_error (char *args, int from_tty)
121
{
122
  internal_error ("internal maintenance");
123
}
124
 
125
/* Someday we should allow demangling for things other than just
126
   explicit strings.  For example, we might want to be able to specify
127
   the address of a string in either GDB's process space or the
128
   debuggee's process space, and have gdb fetch and demangle that
129
   string.  If we have a char* pointer "ptr" that points to a string,
130
   we might want to be able to given just the name and have GDB
131
   demangle and print what it points to, etc.  (FIXME) */
132
 
133
static void
134
maintenance_demangle (args, from_tty)
135
     char *args;
136
     int from_tty;
137
{
138
  char *demangled;
139
 
140
  if (args == NULL || *args == '\0')
141
    {
142
      printf_unfiltered ("\"maintenance demangle\" takes an argument to demangle.\n");
143
    }
144
  else
145
    {
146
      demangled = cplus_demangle (args, DMGL_ANSI | DMGL_PARAMS);
147
      if (demangled != NULL)
148
        {
149
          printf_unfiltered ("%s\n", demangled);
150
          free (demangled);
151
        }
152
      else
153
        {
154
          printf_unfiltered ("Can't demangle \"%s\"\n", args);
155
        }
156
    }
157
}
158
 
159
static void
160
maintenance_time_display (args, from_tty)
161
     char *args;
162
     int from_tty;
163
{
164
  extern int display_time;
165
 
166
  if (args == NULL || *args == '\0')
167
    printf_unfiltered ("\"maintenance time\" takes a numeric argument.\n");
168
  else
169
    display_time = strtol (args, NULL, 10);
170
}
171
 
172
static void
173
maintenance_space_display (args, from_tty)
174
     char *args;
175
     int from_tty;
176
{
177
  extern int display_space;
178
 
179
  if (args == NULL || *args == '\0')
180
    printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
181
  else
182
    display_space = strtol (args, NULL, 10);
183
}
184
 
185
/* The "maintenance info" command is defined as a prefix, with
186
   allow_unknown 0.  Therefore, its own definition is called only for
187
   "maintenance info" with no args.  */
188
 
189
/* ARGSUSED */
190
static void
191
maintenance_info_command (arg, from_tty)
192
     char *arg;
193
     int from_tty;
194
{
195
  printf_unfiltered ("\"maintenance info\" must be followed by the name of an info command.\n");
196
  help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout);
197
}
198
 
199
static void
200
print_section_table (abfd, asect, ignore)
201
     bfd *abfd;
202
     asection *asect;
203
     PTR ignore;
204
{
205
  flagword flags;
206
 
207
  flags = bfd_get_section_flags (abfd, asect);
208
 
209
  /* FIXME-32x64: Need print_address_numeric with field width.  */
210
  printf_filtered ("    %s",
211
                   local_hex_string_custom
212
                   ((unsigned long) bfd_section_vma (abfd, asect), "08l"));
213
  printf_filtered ("->%s",
214
                   local_hex_string_custom
215
                   ((unsigned long) (bfd_section_vma (abfd, asect)
216
                                     + bfd_section_size (abfd, asect)),
217
                    "08l"));
218
  printf_filtered (" at %s",
219
                   local_hex_string_custom
220
                   ((unsigned long) asect->filepos, "08l"));
221
  printf_filtered (": %s", bfd_section_name (abfd, asect));
222
 
223
  if (flags & SEC_ALLOC)
224
    printf_filtered (" ALLOC");
225
  if (flags & SEC_LOAD)
226
    printf_filtered (" LOAD");
227
  if (flags & SEC_RELOC)
228
    printf_filtered (" RELOC");
229
  if (flags & SEC_READONLY)
230
    printf_filtered (" READONLY");
231
  if (flags & SEC_CODE)
232
    printf_filtered (" CODE");
233
  if (flags & SEC_DATA)
234
    printf_filtered (" DATA");
235
  if (flags & SEC_ROM)
236
    printf_filtered (" ROM");
237
  if (flags & SEC_CONSTRUCTOR)
238
    printf_filtered (" CONSTRUCTOR");
239
  if (flags & SEC_HAS_CONTENTS)
240
    printf_filtered (" HAS_CONTENTS");
241
  if (flags & SEC_NEVER_LOAD)
242
    printf_filtered (" NEVER_LOAD");
243
  if (flags & SEC_COFF_SHARED_LIBRARY)
244
    printf_filtered (" COFF_SHARED_LIBRARY");
245
  if (flags & SEC_IS_COMMON)
246
    printf_filtered (" IS_COMMON");
247
 
248
  printf_filtered ("\n");
249
}
250
 
251
/* ARGSUSED */
252
static void
253
maintenance_info_sections (arg, from_tty)
254
     char *arg;
255
     int from_tty;
256
{
257
  if (exec_bfd)
258
    {
259
      printf_filtered ("Exec file:\n");
260
      printf_filtered ("    `%s', ", bfd_get_filename (exec_bfd));
261
      wrap_here ("        ");
262
      printf_filtered ("file type %s.\n", bfd_get_target (exec_bfd));
263
      bfd_map_over_sections (exec_bfd, print_section_table, 0);
264
    }
265
 
266
  if (core_bfd)
267
    {
268
      printf_filtered ("Core file:\n");
269
      printf_filtered ("    `%s', ", bfd_get_filename (core_bfd));
270
      wrap_here ("        ");
271
      printf_filtered ("file type %s.\n", bfd_get_target (core_bfd));
272
      bfd_map_over_sections (core_bfd, print_section_table, 0);
273
    }
274
}
275
 
276
/* ARGSUSED */
277
void
278
maintenance_print_statistics (args, from_tty)
279
     char *args;
280
     int from_tty;
281
{
282
  print_objfile_statistics ();
283
  print_symbol_bcache_statistics ();
284
}
285
 
286
/* The "maintenance print" command is defined as a prefix, with
287
   allow_unknown 0.  Therefore, its own definition is called only for
288
   "maintenance print" with no args.  */
289
 
290
/* ARGSUSED */
291
static void
292
maintenance_print_command (arg, from_tty)
293
     char *arg;
294
     int from_tty;
295
{
296
  printf_unfiltered ("\"maintenance print\" must be followed by the name of a print command.\n");
297
  help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout);
298
}
299
 
300
/* The "maintenance translate-address" command converts a section and address
301
   to a symbol.  This can be called in two ways:
302
   maintenance translate-address <secname> <addr>
303
   or   maintenance translate-address <addr>
304
 */
305
 
306
static void
307
maintenance_translate_address (arg, from_tty)
308
     char *arg;
309
     int from_tty;
310
{
311
  CORE_ADDR address;
312
  asection *sect;
313
  char *p;
314
  struct minimal_symbol *sym;
315
  struct objfile *objfile;
316
 
317
  if (arg == NULL || *arg == 0)
318
    error ("requires argument (address or section + address)");
319
 
320
  sect = NULL;
321
  p = arg;
322
 
323
  if (!isdigit (*p))
324
    {                           /* See if we have a valid section name */
325
      while (*p && !isspace (*p))       /* Find end of section name */
326
        p++;
327
      if (*p == '\000')         /* End of command? */
328
        error ("Need to specify <section-name> and <address>");
329
      *p++ = '\000';
330
      while (isspace (*p))
331
        p++;                    /* Skip whitespace */
332
 
333
      ALL_OBJFILES (objfile)
334
      {
335
        sect = bfd_get_section_by_name (objfile->obfd, arg);
336
        if (sect != NULL)
337
          break;
338
      }
339
 
340
      if (!sect)
341
        error ("Unknown section %s.", arg);
342
    }
343
 
344
  address = parse_and_eval_address (p);
345
 
346
  if (sect)
347
    sym = lookup_minimal_symbol_by_pc_section (address, sect);
348
  else
349
    sym = lookup_minimal_symbol_by_pc (address);
350
 
351
  if (sym)
352
    printf_filtered ("%s+%s\n",
353
                     SYMBOL_SOURCE_NAME (sym),
354
                     paddr_u (address - SYMBOL_VALUE_ADDRESS (sym)));
355
  else if (sect)
356
    printf_filtered ("no symbol at %s:0x%s\n", sect->name, paddr (address));
357
  else
358
    printf_filtered ("no symbol at 0x%s\n", paddr (address));
359
 
360
  return;
361
}
362
 
363
 
364
/* When a comamnd is deprecated the user will be warned the first time
365
   the command is used.  If possible, a replacement will be
366
   offered. */
367
 
368
static void
369
maintenance_deprecate (char *args, int from_tty)
370
{
371
  if (args == NULL || *args == '\0')
372
    {
373
      printf_unfiltered ("\"maintenance deprecate\" takes an argument, \n\
374
the command you want to deprecate, and optionally the replacement command \n\
375
enclosed in quotes.\n");
376
    }
377
 
378
  maintenance_do_deprecate (args, 1);
379
 
380
}
381
 
382
 
383
static void
384
maintenance_undeprecate (char *args, int from_tty)
385
{
386
  if (args == NULL || *args == '\0')
387
    {
388
      printf_unfiltered ("\"maintenance undeprecate\" takes an argument, \n\
389
the command you want to undeprecate.\n");
390
    }
391
 
392
  maintenance_do_deprecate (args, 0);
393
 
394
}
395
 
396
/* You really shouldn't be using this. It is just for the testsuite.
397
   Rather, you should use deprecate_cmd() when the command is created
398
   in _initialize_blah().
399
 
400
   This function deprecates a command and optionally assigns it a
401
   replacement.  */
402
 
403
static void
404
maintenance_do_deprecate (char *text, int deprecate)
405
{
406
 
407
  struct cmd_list_element *alias = NULL;
408
  struct cmd_list_element *prefix_cmd = NULL;
409
  struct cmd_list_element *cmd = NULL;
410
 
411
  char *start_ptr = NULL;
412
  char *end_ptr = NULL;
413
  int len;
414
  char *replacement = NULL;
415
 
416
  if (text == NULL)
417
    return;
418
 
419
  if (!lookup_cmd_composition (text, &alias, &prefix_cmd, &cmd))
420
    {
421
      printf_filtered ("Can't find command '%s' to deprecate.\n", text);
422
      return;
423
    }
424
 
425
  if (deprecate)
426
    {
427
      /* look for a replacement command */
428
      start_ptr = strchr (text, '\"');
429
      if (start_ptr != NULL)
430
        {
431
          start_ptr++;
432
          end_ptr = strrchr (start_ptr, '\"');
433
          if (end_ptr != NULL)
434
            {
435
              len = end_ptr - start_ptr;
436
              start_ptr[len] = '\0';
437
              replacement = xstrdup (start_ptr);
438
            }
439
        }
440
    }
441
 
442
  if (!start_ptr || !end_ptr)
443
    replacement = NULL;
444
 
445
 
446
  /* If they used an alias, we only want to deprecate the alias.
447
 
448
     Note the MALLOCED_REPLACEMENT test.  If the command's replacement
449
     string was allocated at compile time we don't want to free the
450
     memory. */
451
  if (alias)
452
    {
453
 
454
      if (alias->flags & MALLOCED_REPLACEMENT)
455
        free (alias->replacement);
456
 
457
      if (deprecate)
458
        alias->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
459
      else
460
        alias->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
461
      alias->replacement = replacement;
462
      alias->flags |= MALLOCED_REPLACEMENT;
463
      return;
464
    }
465
  else if (cmd)
466
    {
467
      if (cmd->flags & MALLOCED_REPLACEMENT)
468
        free (cmd->replacement);
469
 
470
      if (deprecate)
471
        cmd->flags |= (DEPRECATED_WARN_USER | CMD_DEPRECATED);
472
      else
473
        cmd->flags &= ~(DEPRECATED_WARN_USER | CMD_DEPRECATED);
474
      cmd->replacement = replacement;
475
      cmd->flags |= MALLOCED_REPLACEMENT;
476
      return;
477
    }
478
}
479
 
480
 
481
void
482
_initialize_maint_cmds ()
483
{
484
  add_prefix_cmd ("maintenance", class_maintenance, maintenance_command,
485
                  "Commands for use by GDB maintainers.\n\
486
Includes commands to dump specific internal GDB structures in\n\
487
a human readable form, to cause GDB to deliberately dump core,\n\
488
to test internal functions such as the C++ demangler, etc.",
489
                  &maintenancelist, "maintenance ", 0,
490
                  &cmdlist);
491
 
492
  add_com_alias ("mt", "maintenance", class_maintenance, 1);
493
 
494
  add_prefix_cmd ("info", class_maintenance, maintenance_info_command,
495
     "Commands for showing internal info about the program being debugged.",
496
                  &maintenanceinfolist, "maintenance info ", 0,
497
                  &maintenancelist);
498
  add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
499
 
500
  add_cmd ("sections", class_maintenance, maintenance_info_sections,
501
           "List the BFD sections of the exec and core files.",
502
           &maintenanceinfolist);
503
 
504
  add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
505
                  "Maintenance command for printing GDB internal state.",
506
                  &maintenanceprintlist, "maintenance print ", 0,
507
                  &maintenancelist);
508
 
509
#ifndef _WIN32
510
  add_cmd ("dump-me", class_maintenance, maintenance_dump_me,
511
           "Get fatal error; make debugger dump its core.\n\
512
GDB sets it's handling of SIGQUIT back to SIG_DFL and then sends\n\
513
itself a SIGQUIT signal.",
514
           &maintenancelist);
515
#endif
516
 
517
  add_cmd ("internal-error", class_maintenance, maintenance_internal_error,
518
           "Give GDB an internal error.\n\
519
Cause GDB to behave as if an internal error was detected.",
520
           &maintenancelist);
521
 
522
  add_cmd ("demangle", class_maintenance, maintenance_demangle,
523
           "Demangle a C++ mangled name.\n\
524
Call internal GDB demangler routine to demangle a C++ link name\n\
525
and prints the result.",
526
           &maintenancelist);
527
 
528
  add_cmd ("time", class_maintenance, maintenance_time_display,
529
           "Set the display of time usage.\n\
530
If nonzero, will cause the execution time for each command to be\n\
531
displayed, following the command's output.",
532
           &maintenancelist);
533
 
534
  add_cmd ("space", class_maintenance, maintenance_space_display,
535
           "Set the display of space usage.\n\
536
If nonzero, will cause the execution space for each command to be\n\
537
displayed, following the command's output.",
538
           &maintenancelist);
539
 
540
  add_cmd ("type", class_maintenance, maintenance_print_type,
541
           "Print a type chain for a given symbol.\n\
542
For each node in a type chain, print the raw data for each member of\n\
543
the type structure, and the interpretation of the data.",
544
           &maintenanceprintlist);
545
 
546
  add_cmd ("symbols", class_maintenance, maintenance_print_symbols,
547
           "Print dump of current symbol definitions.\n\
548
Entries in the full symbol table are dumped to file OUTFILE.\n\
549
If a SOURCE file is specified, dump only that file's symbols.",
550
           &maintenanceprintlist);
551
 
552
  add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols,
553
           "Print dump of current minimal symbol definitions.\n\
554
Entries in the minimal symbol table are dumped to file OUTFILE.\n\
555
If a SOURCE file is specified, dump only that file's minimal symbols.",
556
           &maintenanceprintlist);
557
 
558
  add_cmd ("psymbols", class_maintenance, maintenance_print_psymbols,
559
           "Print dump of current partial symbol definitions.\n\
560
Entries in the partial symbol table are dumped to file OUTFILE.\n\
561
If a SOURCE file is specified, dump only that file's partial symbols.",
562
           &maintenanceprintlist);
563
 
564
  add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
565
           "Print dump of current object file definitions.",
566
           &maintenanceprintlist);
567
 
568
  add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
569
           "Print statistics about internal gdb state.",
570
           &maintenanceprintlist);
571
 
572
  add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
573
           "Check consistency of psymtabs and symtabs.",
574
           &maintenancelist);
575
 
576
  add_cmd ("translate-address", class_maintenance, maintenance_translate_address,
577
           "Translate a section name and address to a symbol.",
578
           &maintenancelist);
579
 
580
  add_cmd ("deprecate", class_maintenance, maintenance_deprecate,
581
           "Deprecate a command.  Note that this is just in here so the \n\
582
testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
583
rather you should use the C function deprecate_cmd().  If you decide you \n\
584
want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
585
replacement is optional.", &maintenancelist);
586
 
587
  add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate,
588
           "Undeprecate a command.  Note that this is just in here so the \n\
589
testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
590
If you decide you want to use it: maintenance undeprecate 'commandname'",
591
           &maintenancelist);
592
 
593
  add_show_from_set (
594
                      add_set_cmd ("watchdog", class_maintenance, var_zinteger, (char *) &watchdog,
595
                                   "Set watchdog timer.\n\
596
When non-zero, this timeout is used instead of waiting forever for a target to\n\
597
finish a low-level step or continue operation.  If the specified amount of time\n\
598
passes without a response from the target, an error occurs.", &setlist),
599
                      &showlist);
600
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.