/* Support for GDB maintenance commands.
- Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001
- Free Software Foundation, Inc.
+
+ Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
+ 2002, 2003, 2004 Free Software Foundation, Inc.
+
Written by Fred Fish at Cygnus Support.
This file is part of GDB.
#include "objfiles.h"
#include "value.h"
+#include "cli/cli-decode.h"
+
extern void _initialize_maint_cmds (void);
static void maintenance_command (char *, int);
static void maintenance_info_command (char *, int);
-static void print_section_table (bfd *, asection *, void *);
-
static void maintenance_info_sections (char *, int);
static void maintenance_print_command (char *, int);
}
#ifndef _WIN32
-/* ARGSUSED */
static void
maintenance_dump_me (char *args, int from_tty)
{
static void
maintenance_internal_error (char *args, int from_tty)
{
- internal_error (__FILE__, __LINE__,
- "internal maintenance");
+ internal_error (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
+}
+
+/* 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. */
+
+static void
+maintenance_internal_warning (char *args, int from_tty)
+{
+ internal_warning (__FILE__, __LINE__, "%s", (args == NULL ? "" : args));
}
/* Someday we should allow demangling for things other than just
}
else
{
- demangled = cplus_demangle (args, DMGL_ANSI | DMGL_PARAMS);
+ demangled = language_demangle (current_language, args,
+ DMGL_ANSI | DMGL_PARAMS);
if (demangled != NULL)
{
printf_unfiltered ("%s\n", demangled);
allow_unknown 0. Therefore, its own definition is called only for
"maintenance info" with no args. */
-/* ARGSUSED */
static void
maintenance_info_command (char *arg, int from_tty)
{
while ((tok = strstr (string, substr)) != NULL)
{
/* Got a partial match. Is it a whole word? */
- if (tok == string ||
- tok[-1] == ' ' ||
- tok[-1] == '\t')
+ if (tok == string
+ || tok[-1] == ' '
+ || tok[-1] == '\t')
{
/* Token is delimited at the front... */
- if (tok[substr_len] == ' ' ||
- tok[substr_len] == '\t' ||
- tok[substr_len] == '\0')
+ if (tok[substr_len] == ' '
+ || tok[substr_len] == '\t'
+ || tok[substr_len] == '\0')
{
/* Token is delimited at the rear. Got a whole-word match. */
return 1;
}
static void
-print_section_info (const char *name, flagword flags,
- CORE_ADDR addr, CORE_ADDR endaddr,
- unsigned long filepos)
+maint_print_section_info (const char *name, flagword flags,
+ CORE_ADDR addr, CORE_ADDR endaddr,
+ unsigned long filepos)
{
/* FIXME-32x64: Need print_address_numeric with field width. */
printf_filtered (" 0x%s", paddr (addr));
printf_filtered ("->0x%s", paddr (endaddr));
- printf_filtered (" at 0x%s",
+ printf_filtered (" at %s",
local_hex_string_custom ((unsigned long) filepos, "08l"));
printf_filtered (": %s", name);
print_bfd_flags (flags);
flagword flags = bfd_get_section_flags (abfd, asect);
const char *name = bfd_section_name (abfd, asect);
- if (arg == NULL || *((char *) arg) == '\0' ||
- match_substring ((char *) arg, name) ||
- match_bfd_flags ((char *) arg, flags))
+ if (arg == NULL || *((char *) arg) == '\0'
+ || match_substring ((char *) arg, name)
+ || match_bfd_flags ((char *) arg, flags))
{
CORE_ADDR addr, endaddr;
addr = bfd_section_vma (abfd, asect);
endaddr = addr + bfd_section_size (abfd, asect);
- print_section_info (name, flags, addr, endaddr, asect->filepos);
+ maint_print_section_info (name, flags, addr, endaddr, asect->filepos);
}
}
flagword flags = bfd_get_section_flags (abfd, asect->the_bfd_section);
const char *name = bfd_section_name (abfd, asect->the_bfd_section);
- if (string == NULL || *string == '\0' ||
- match_substring (string, name) ||
- match_bfd_flags (string, flags))
+ if (string == NULL || *string == '\0'
+ || match_substring (string, name)
+ || match_bfd_flags (string, flags))
{
- print_section_info (name, flags, asect->addr, asect->endaddr,
+ maint_print_section_info (name, flags, asect->addr, asect->endaddr,
asect->the_bfd_section->filepos);
}
}
-/* ARGSUSED */
static void
maintenance_info_sections (char *arg, int from_tty)
{
}
}
-/* ARGSUSED */
void
maintenance_print_statistics (char *args, int from_tty)
{
print_symbol_bcache_statistics ();
}
-void
+static void
maintenance_print_architecture (char *args, int from_tty)
{
if (args == NULL)
allow_unknown 0. Therefore, its own definition is called only for
"maintenance print" with no args. */
-/* ARGSUSED */
static void
maintenance_print_command (char *arg, int from_tty)
{
if (sym)
printf_filtered ("%s+%s\n",
- SYMBOL_SOURCE_NAME (sym),
+ SYMBOL_PRINT_NAME (sym),
paddr_u (address - SYMBOL_VALUE_ADDRESS (sym)));
else if (sect)
printf_filtered ("no symbol at %s:0x%s\n", sect->name, paddr (address));
cmd_show_list (maintenance_show_cmdlist, from_tty, "");
}
-#ifdef NOTYET
/* Profiling support. */
static int maintenance_profile_p;
+#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP)
+
+#ifdef HAVE__ETEXT
+extern char _etext;
+#define TEXTEND &_etext
+#else
+extern char etext;
+#define TEXTEND &etext
+#endif
+
+static int profiling_state;
+
+static void
+mcleanup_wrapper (void)
+{
+ extern void _mcleanup (void);
+
+ if (profiling_state)
+ _mcleanup ();
+}
+
static void
maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
{
- maintenance_profile_p = 0;
- warning ("\"maintenance set profile\" command not supported.\n");
+ if (maintenance_profile_p == profiling_state)
+ return;
+
+ profiling_state = maintenance_profile_p;
+
+ if (maintenance_profile_p)
+ {
+ static int profiling_initialized;
+
+ extern void monstartup (unsigned long, unsigned long);
+ extern int main();
+
+ if (!profiling_initialized)
+ {
+ atexit (mcleanup_wrapper);
+ profiling_initialized = 1;
+ }
+
+ /* "main" is now always the first function in the text segment, so use
+ its address for monstartup. */
+ monstartup ((unsigned long) &main, (unsigned long) TEXTEND);
+ }
+ else
+ {
+ extern void _mcleanup (void);
+ _mcleanup ();
+ }
+}
+#else
+static void
+maintenance_set_profile_cmd (char *args, int from_tty, struct cmd_list_element *c)
+{
+ error ("Profiling support is not available on this system.");
}
#endif
"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++ demangler, etc.",
+to test internal functions such as the C++/ObjC demangler, etc.",
&maintenancelist, "maintenance ", 0,
&cmdlist);
add_alias_cmd ("i", "info", class_maintenance, 1, &maintenancelist);
add_cmd ("sections", class_maintenance, maintenance_info_sections,
- "List the BFD sections of the exec and core files. \n
+ "List the BFD sections of the exec and core files. \n\
Arguments may be any combination of:\n\
[one or more section names]\n\
ALLOC LOAD RELOC READONLY CODE DATA ROM CONSTRUCTOR\n\
#ifndef _WIN32
add_cmd ("dump-me", class_maintenance, maintenance_dump_me,
"Get fatal error; make debugger dump its core.\n\
-GDB sets it's handling of SIGQUIT back to SIG_DFL and then sends\n\
+GDB sets its handling of SIGQUIT back to SIG_DFL and then sends\n\
itself a SIGQUIT signal.",
&maintenancelist);
#endif
Cause GDB to behave as if an internal error was detected.",
&maintenancelist);
+ add_cmd ("internal-warning", class_maintenance, maintenance_internal_warning,
+ "Give GDB an internal warning.\n\
+Cause GDB to behave as if an internal warning was reported.",
+ &maintenancelist);
+
add_cmd ("demangle", class_maintenance, maintenance_demangle,
- "Demangle a C++ mangled name.\n\
+ "Demangle a C++/ObjC mangled name.\n\
Call internal GDB demangler routine to demangle a C++ link name\n\
and prints the result.",
&maintenancelist);
"Print dump of current object file definitions.",
&maintenanceprintlist);
+ add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs,
+ "List the full symbol tables for all object files.\n\
+This does not include information about individual symbols, blocks, or\n\
+linetables --- just the symbol table structures themselves.\n\
+With an argument REGEXP, list the symbol tables whose names that match that.",
+ &maintenanceinfolist);
+
+ add_cmd ("psymtabs", class_maintenance, maintenance_info_psymtabs,
+ "List the partial symbol tables for all object files.\n\
+This does not include information about individual partial symbols,\n\
+just the symbol table structures themselves.",
+ &maintenanceinfolist);
+
add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
"Print statistics about internal gdb state.",
&maintenanceprintlist);
&showlist);
-#ifdef NOTYET
- /* FIXME: cagney/2001-09-24: A patch introducing a
- add_set_boolean_cmd() is pending, the below should probably use
- it. A patch implementing profiling is pending, this just sets up
- the framework. */
- tmpcmd = add_set_cmd ("profile", class_maintenance,
- var_boolean, &maintenance_profile_p,
- "Set internal profiling.\n\
-When enabled GDB is profiled.",
- &maintenance_set_cmdlist);
- tmpcmd->function.sfunc = maintenance_set_profile_cmd;
- add_show_from_set (tmpcmd, &maintenance_show_cmdlist);
-#endif
+ add_setshow_boolean_cmd ("profile", class_maintenance,
+ &maintenance_profile_p,
+ "Set internal profiling.\n"
+ "When enabled GDB is profiled.",
+ "Show internal profiling.\n",
+ maintenance_set_profile_cmd, NULL,
+ &maintenance_set_cmdlist,
+ &maintenance_show_cmdlist);
}