/* 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, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
+ 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
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,
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 <http://www.gnu.org/licenses/>. */
#include "defs.h"
+#include "arch-utils.h"
#include <ctype.h>
#include <signal.h>
#include "command.h"
#include "symfile.h"
#include "objfiles.h"
#include "value.h"
+#include "gdb_assert.h"
#include "cli/cli-decode.h"
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);
and one with slow communications. */
int watchdog = 0;
+static void
+show_watchdog (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("Watchdog timer is %s.\n"), value);
+}
/*
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. */
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
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);
|| 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);
}
}
|| 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);
}
}
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);
}
}
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;
while (isspace (*p))
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);
}
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;
}
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;
memory. */
if (alias)
{
-
if (alias->flags & MALLOCED_REPLACEMENT)
xfree (alias->replacement);
/* Profiling support. */
static int maintenance_profile_p;
-
-#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP)
+static void
+show_maintenance_profile_p (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
+{
+ fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
+}
#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
else
{
extern void _mcleanup (void);
+
_mcleanup ();
}
}
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\
+ 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\
a human readable form, to cause GDB to deliberately dump core,\n\
-to test internal functions such as the C++/ObjC demangler, etc.",
+to test internal functions such as the C++/ObjC demangler, etc."),
&maintenancelist, "maintenance ", 0,
&cmdlist);
add_com_alias ("mt", "maintenance", class_maintenance, 1);
- add_prefix_cmd ("info", class_maintenance, maintenance_info_command,
- "Commands for showing internal info about the program being debugged.",
+ add_prefix_cmd ("info", class_maintenance, maintenance_info_command, _("\
+Commands for showing internal info about the program being debugged."),
&maintenanceinfolist, "maintenance info ", 0,
&maintenancelist);
add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
&maintenanceinfolist);
add_prefix_cmd ("print", class_maintenance, maintenance_print_command,
- "Maintenance command for printing GDB internal state.",
+ _("Maintenance command for printing GDB internal state."),
&maintenanceprintlist, "maintenance print ", 0,
&maintenancelist);
- add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, "\
+ add_prefix_cmd ("set", class_maintenance, maintenance_set_cmd, _("\
Set GDB internal variables used by the GDB maintainer.\n\
-Configure variables internal to GDB that aid in GDB's maintenance",
+Configure variables internal to GDB that aid in GDB's maintenance"),
&maintenance_set_cmdlist, "maintenance set ",
0/*allow-unknown*/,
&maintenancelist);
- add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, "\
+ add_prefix_cmd ("show", class_maintenance, maintenance_show_cmd, _("\
Show GDB internal variables used by the GDB maintainer.\n\
-Configure variables internal to GDB that aid in GDB's maintenance",
+Configure variables internal to GDB that aid in GDB's maintenance"),
&maintenance_show_cmdlist, "maintenance show ",
0/*allow-unknown*/,
&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);
- deprecated_add_show_from_set
- (add_set_cmd ("watchdog", class_maintenance, var_zinteger,
- (char *) &watchdog,
- "Set watchdog timer.\n\
+ add_setshow_zinteger_cmd ("watchdog", class_maintenance, &watchdog, _("\
+Set watchdog timer."), _("\
+Show watchdog timer."), _("\
When non-zero, this timeout is used instead of waiting forever for a target\n\
to finish a low-level step or continue operation. If the specified amount\n\
-of time passes without a response from the target, an error occurs.",
- &setlist),
- &showlist);
-
+of time passes without a response from the target, an error occurs."),
+ NULL,
+ show_watchdog,
+ &setlist, &showlist);
add_setshow_boolean_cmd ("profile", class_maintenance,
&maintenance_profile_p, _("\
Set internal profiling."), _("\
Show internal profiling."), _("\
When enabled GDB is profiled."),
- NULL, /* FIXME: i18n: Internal profiling is %s. */
- maintenance_set_profile_cmd, NULL,
+ maintenance_set_profile_cmd,
+ show_maintenance_profile_p,
&maintenance_set_cmdlist,
&maintenance_show_cmdlist);
}