X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmaint.c;h=6a106fd387c391f348c075c20a235359a09df068;hb=0b30217134add051e159a192066a1e568ebd837f;hp=30655cfaf57514476d5bab90fff4ab9842191b36;hpb=920d2a441963dd93b50e836dfabdd58e7f0016fb;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/maint.c b/gdb/maint.c index 30655cfaf5..6a106fd387 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -1,7 +1,7 @@ /* Support for GDB maintenance commands. - Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, - 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1992-1997, 1999-2004, 2007-2012 Free Software + Foundation, Inc. Written by Fred Fish at Cygnus Support. @@ -9,7 +9,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -18,12 +18,11 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include #include #include "command.h" @@ -37,6 +36,7 @@ #include "symfile.h" #include "objfiles.h" #include "value.h" +#include "gdb_assert.h" #include "cli/cli-decode.h" @@ -44,8 +44,6 @@ extern void _initialize_maint_cmds (void); static void maintenance_command (char *, int); -static void maintenance_dump_me (char *, int); - static void maintenance_internal_error (char *args, int from_tty); static void maintenance_demangle (char *, int); @@ -76,24 +74,13 @@ show_watchdog (struct ui_file *file, int from_tty, fprintf_filtered (file, _("Watchdog timer is %s.\n"), value); } -/* - - LOCAL FUNCTION - - maintenance_command -- access the maintenance subcommands - - SYNOPSIS - - void maintenance_command (char *args, int from_tty) - - DESCRIPTION - - */ +/* Access the maintenance subcommands. */ static void maintenance_command (char *args, int from_tty) { - printf_unfiltered (_("\"maintenance\" must be followed by the name of a maintenance command.\n")); + printf_unfiltered (_("\"maintenance\" must be followed by " + "the name of a maintenance command.\n")); help_list (maintenancelist, "maintenance ", -1, gdb_stdout); } @@ -101,7 +88,7 @@ maintenance_command (char *args, int from_tty) static void maintenance_dump_me (char *args, int from_tty) { - if (query ("Should GDB dump core? ")) + if (query (_("Should GDB dump core? "))) { #ifdef __DJGPP__ /* SIGQUIT by default is ignored, so use SIGABRT instead. */ @@ -118,7 +105,7 @@ maintenance_dump_me (char *args, int from_tty) /* Stimulate the internal error mechanism that GDB uses when an internal problem is detected. Allows testing of the mechanism. Also useful when the user wants to drop a core file but not exit - GDB. */ + GDB. */ static void maintenance_internal_error (char *args, int from_tty) @@ -129,7 +116,7 @@ maintenance_internal_error (char *args, int from_tty) /* Stimulate the internal error mechanism that GDB uses when an internal problem is detected. Allows testing of the mechanism. Also useful when the user wants to drop a core file but not exit - GDB. */ + GDB. */ static void maintenance_internal_warning (char *args, int from_tty) @@ -143,7 +130,7 @@ maintenance_internal_warning (char *args, int from_tty) debuggee's process space, and have gdb fetch and demangle that string. If we have a char* pointer "ptr" that points to a string, we might want to be able to given just the name and have GDB - demangle and print what it points to, etc. (FIXME) */ + demangle and print what it points to, etc. (FIXME) */ static void maintenance_demangle (char *args, int from_tty) @@ -152,7 +139,8 @@ maintenance_demangle (char *args, int from_tty) if (args == NULL || *args == '\0') { - printf_unfiltered (_("\"maintenance demangle\" takes an argument to demangle.\n")); + printf_unfiltered (_("\"maintenance demangle\" takes " + "an argument to demangle.\n")); } else { @@ -173,23 +161,19 @@ maintenance_demangle (char *args, int from_tty) static void maintenance_time_display (char *args, int from_tty) { - extern int display_time; - if (args == NULL || *args == '\0') printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n")); else - display_time = strtol (args, NULL, 10); + set_display_time (strtol (args, NULL, 10)); } static void maintenance_space_display (char *args, int from_tty) { - extern int display_space; - if (args == NULL || *args == '\0') printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n"); else - display_space = strtol (args, NULL, 10); + set_display_space (strtol (args, NULL, 10)); } /* The "maintenance info" command is defined as a prefix, with @@ -199,7 +183,8 @@ maintenance_space_display (char *args, int from_tty) static void maintenance_info_command (char *arg, int from_tty) { - printf_unfiltered (_("\"maintenance info\" must be followed by the name of an info command.\n")); + printf_unfiltered (_("\"maintenance info\" must be followed " + "by the name of an info command.\n")); help_list (maintenanceinfolist, "maintenance info ", -1, gdb_stdout); } @@ -213,12 +198,12 @@ match_substring (const char *string, const char *substr) while ((tok = strstr (string, substr)) != NULL) { - /* Got a partial match. Is it a whole word? */ + /* Got a partial match. Is it a whole word? */ if (tok == string || tok[-1] == ' ' || tok[-1] == '\t') { - /* Token is delimited at the front... */ + /* Token is delimited at the front... */ if (tok[substr_len] == ' ' || tok[substr_len] == '\t' || tok[substr_len] == '\0') @@ -308,12 +293,10 @@ print_bfd_flags (flagword flags) static void maint_print_section_info (const char *name, flagword flags, CORE_ADDR addr, CORE_ADDR endaddr, - unsigned long filepos) + unsigned long filepos, int addr_size) { - /* FIXME-32x64: Need deprecated_print_address_numeric with field - width. */ - printf_filtered (" 0x%s", paddr (addr)); - printf_filtered ("->0x%s", paddr (endaddr)); + printf_filtered (" %s", hex_string_custom (addr, addr_size)); + printf_filtered ("->%s", hex_string_custom (endaddr, addr_size)); printf_filtered (" at %s", hex_string_custom ((unsigned long) filepos, 8)); printf_filtered (": %s", name); @@ -333,11 +316,14 @@ print_bfd_section_info (bfd *abfd, || match_substring ((char *) arg, name) || match_bfd_flags ((char *) arg, flags)) { + struct gdbarch *gdbarch = gdbarch_from_bfd (abfd); + int addr_size = gdbarch_addr_bit (gdbarch) / 8; CORE_ADDR addr, endaddr; addr = bfd_section_vma (abfd, asect); endaddr = addr + bfd_section_size (abfd, asect); - maint_print_section_info (name, flags, addr, endaddr, asect->filepos); + maint_print_section_info (name, flags, addr, endaddr, + asect->filepos, addr_size); } } @@ -353,8 +339,14 @@ print_objfile_section_info (bfd *abfd, || match_substring (string, name) || match_bfd_flags (string, flags)) { - maint_print_section_info (name, flags, asect->addr, asect->endaddr, - asect->the_bfd_section->filepos); + struct gdbarch *gdbarch = gdbarch_from_bfd (abfd); + int addr_size = gdbarch_addr_bit (gdbarch) / 8; + + maint_print_section_info (name, flags, + obj_section_addr (asect), + obj_section_endaddr (asect), + asect->the_bfd_section->filepos, + addr_size); } } @@ -413,15 +405,20 @@ maintenance_print_statistics (char *args, int from_tty) static void maintenance_print_architecture (char *args, int from_tty) { + struct gdbarch *gdbarch = get_current_arch (); + if (args == NULL) - gdbarch_dump (current_gdbarch, gdb_stdout); + gdbarch_dump (gdbarch, gdb_stdout); else { + struct cleanup *cleanups; struct ui_file *file = gdb_fopen (args, "w"); + if (file == NULL) perror_with_name (_("maintenance print architecture")); - gdbarch_dump (current_gdbarch, file); - ui_file_delete (file); + cleanups = make_cleanup_ui_file_delete (file); + gdbarch_dump (gdbarch, file); + do_cleanups (cleanups); } } @@ -432,21 +429,21 @@ maintenance_print_architecture (char *args, int from_tty) static void maintenance_print_command (char *arg, int from_tty) { - printf_unfiltered (_("\"maintenance print\" must be followed by the name of a print command.\n")); + printf_unfiltered (_("\"maintenance print\" must be followed " + "by the name of a print command.\n")); help_list (maintenanceprintlist, "maintenance print ", -1, gdb_stdout); } /* The "maintenance translate-address" command converts a section and address to a symbol. This can be called in two ways: maintenance translate-address - or maintenance translate-address - */ + or maintenance translate-address . */ static void maintenance_translate_address (char *arg, int from_tty) { CORE_ADDR address; - asection *sect; + struct obj_section *sect; char *p; struct minimal_symbol *sym; struct objfile *objfile; @@ -458,23 +455,22 @@ maintenance_translate_address (char *arg, int from_tty) p = arg; if (!isdigit (*p)) - { /* See if we have a valid section name */ - while (*p && !isspace (*p)) /* Find end of section name */ + { /* See if we have a valid section name. */ + while (*p && !isspace (*p)) /* Find end of section name. */ p++; - if (*p == '\000') /* End of command? */ + if (*p == '\000') /* End of command? */ error (_("Need to specify and
")); *p++ = '\000'; while (isspace (*p)) - p++; /* Skip whitespace */ + p++; /* Skip whitespace. */ - ALL_OBJFILES (objfile) + ALL_OBJSECTIONS (objfile, sect) { - sect = bfd_get_section_by_name (objfile->obfd, arg); - if (sect != NULL) + if (strcmp (sect->the_bfd_section->name, arg) == 0) break; } - if (!sect) + if (!objfile) error (_("Unknown section %s."), arg); } @@ -486,13 +482,39 @@ maintenance_translate_address (char *arg, int from_tty) sym = lookup_minimal_symbol_by_pc (address); if (sym) - printf_filtered ("%s+%s\n", - SYMBOL_PRINT_NAME (sym), - paddr_u (address - SYMBOL_VALUE_ADDRESS (sym))); + { + const char *symbol_name = SYMBOL_PRINT_NAME (sym); + const char *symbol_offset + = pulongest (address - SYMBOL_VALUE_ADDRESS (sym)); + + sect = SYMBOL_OBJ_SECTION(sym); + if (sect != NULL) + { + const char *section_name; + const char *obj_name; + + gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name); + section_name = sect->the_bfd_section->name; + + gdb_assert (sect->objfile && sect->objfile->name); + obj_name = sect->objfile->name; + + if (MULTI_OBJFILE_P ()) + printf_filtered (_("%s + %s in section %s of %s\n"), + symbol_name, symbol_offset, + section_name, obj_name); + else + printf_filtered (_("%s + %s in section %s\n"), + symbol_name, symbol_offset, section_name); + } + else + printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset); + } else if (sect) - printf_filtered (_("no symbol at %s:0x%s\n"), sect->name, paddr (address)); + printf_filtered (_("no symbol at %s:%s\n"), + sect->the_bfd_section->name, hex_string (address)); else - printf_filtered (_("no symbol at 0x%s\n"), paddr (address)); + printf_filtered (_("no symbol at %s\n"), hex_string (address)); return; } @@ -500,15 +522,15 @@ maintenance_translate_address (char *arg, int from_tty) /* When a command is deprecated the user will be warned the first time the command is used. If possible, a replacement will be - offered. */ + offered. */ static void maintenance_deprecate (char *args, int from_tty) { if (args == NULL || *args == '\0') { - printf_unfiltered (_("\"maintenance deprecate\" takes an argument, \n\ -the command you want to deprecate, and optionally the replacement command \n\ + printf_unfiltered (_("\"maintenance deprecate\" takes an argument,\n\ +the command you want to deprecate, and optionally the replacement command\n\ enclosed in quotes.\n")); } @@ -530,7 +552,7 @@ the command you want to undeprecate.\n")); } -/* You really shouldn't be using this. It is just for the testsuite. +/* You really shouldn't be using this. It is just for the testsuite. Rather, you should use deprecate_cmd() when the command is created in _initialize_blah(). @@ -540,7 +562,6 @@ the command you want to undeprecate.\n")); static void maintenance_do_deprecate (char *text, int deprecate) { - struct cmd_list_element *alias = NULL; struct cmd_list_element *prefix_cmd = NULL; struct cmd_list_element *cmd = NULL; @@ -561,7 +582,7 @@ maintenance_do_deprecate (char *text, int deprecate) if (deprecate) { - /* look for a replacement command */ + /* Look for a replacement command. */ start_ptr = strchr (text, '\"'); if (start_ptr != NULL) { @@ -584,10 +605,9 @@ maintenance_do_deprecate (char *text, int deprecate) Note the MALLOCED_REPLACEMENT test. If the command's replacement string was allocated at compile time we don't want to free the - memory. */ + memory. */ if (alias) { - if (alias->flags & MALLOCED_REPLACEMENT) xfree (alias->replacement); @@ -612,6 +632,7 @@ maintenance_do_deprecate (char *text, int deprecate) cmd->flags |= MALLOCED_REPLACEMENT; return; } + xfree (replacement); } /* Maintenance set/show framework. */ @@ -622,7 +643,8 @@ struct cmd_list_element *maintenance_show_cmdlist; static void maintenance_set_cmd (char *args, int from_tty) { - printf_unfiltered (_("\"maintenance set\" must be followed by the name of a set command.\n")); + printf_unfiltered (_("\"maintenance set\" must be followed " + "by the name of a set command.\n")); help_list (maintenance_set_cmdlist, "maintenance set ", -1, gdb_stdout); } @@ -642,16 +664,16 @@ show_maintenance_profile_p (struct ui_file *file, int from_tty, fprintf_filtered (file, _("Internal profiling is %s.\n"), value); } -#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) - #ifdef HAVE__ETEXT extern char _etext; #define TEXTEND &_etext -#else +#elif defined (HAVE_ETEXT) extern char etext; #define TEXTEND &etext #endif +#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND) + static int profiling_state; static void @@ -664,7 +686,8 @@ mcleanup_wrapper (void) } static void -maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c) +maintenance_set_profile_cmd (char *args, int from_tty, + struct cmd_list_element *c) { if (maintenance_profile_p == profiling_state) return; @@ -691,12 +714,14 @@ maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element * else { extern void _mcleanup (void); + _mcleanup (); } } #else static void -maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c) +maintenance_set_profile_cmd (char *args, int from_tty, + struct cmd_list_element *c) { error (_("Profiling support is not available on this system.")); } @@ -705,8 +730,6 @@ maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element * void _initialize_maint_cmds (void) { - struct cmd_list_element *tmpcmd; - add_prefix_cmd ("maintenance", class_maintenance, maintenance_command, _("\ Commands for use by GDB maintainers.\n\ Includes commands to dump specific internal GDB structures in\n\ @@ -847,20 +870,21 @@ Takes an optional file parameter."), _("Check consistency of psymtabs and symtabs."), &maintenancelist); - add_cmd ("translate-address", class_maintenance, maintenance_translate_address, + add_cmd ("translate-address", class_maintenance, + maintenance_translate_address, _("Translate a section name and address to a symbol."), &maintenancelist); add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\ Deprecate a command. Note that this is just in here so the \n\ -testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ +testsuite can check the command deprecator. You probably shouldn't use this,\n\ rather you should use the C function deprecate_cmd(). If you decide you \n\ want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\ replacement is optional."), &maintenancelist); add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\ Undeprecate a command. Note that this is just in here so the \n\ -testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\ +testsuite can check the command deprecator. You probably shouldn't use this,\n\ If you decide you want to use it: maintenance undeprecate 'commandname'"), &maintenancelist);