*** empty log message ***

This commit is contained in:
Jim Kingdon 1991-04-19 01:32:08 +00:00
parent 543e29f11a
commit f266e5641b
6 changed files with 162 additions and 73 deletions

View File

@ -50,7 +50,7 @@ static int executing_breakpoint_commands;
enum enable { disabled, enabled, temporary, delete}; enum enable { disabled, enabled, temporary, delete};
/* Not that the ->silent field is not currently used by any commands /* Not that the ->silent field is not currently used by any commands
(though the code is in there if it was to be and set_raw_breakpoint (though the code is in there if it was to be, and set_raw_breakpoint
does set it to 0). I implemented it because I thought it would be does set it to 0). I implemented it because I thought it would be
useful for a hack I had to put in; I'm going to leave it in because useful for a hack I had to put in; I'm going to leave it in because
I can see how there might be times when it would indeed be useful */ I can see how there might be times when it would indeed be useful */
@ -825,10 +825,10 @@ breakpoint_1 (bnum, watchpoints)
} }
printf_filtered ("#%-3d %c ", b->number, "nyod"[(int) b->enable]); printf_filtered ("#%-3d %c ", b->number, "nyod"[(int) b->enable]);
if (b->address == NULL) if (b->address == NULL) {
printf_filtered (" ");
print_expression (b->exp, stdout); print_expression (b->exp, stdout);
else } else {
{
if (addressprint) if (addressprint)
printf_filtered (" 0x%08x ", b->address); printf_filtered (" 0x%08x ", b->address);
@ -967,6 +967,9 @@ check_duplicates (address)
register struct breakpoint *b; register struct breakpoint *b;
register int count = 0; register int count = 0;
if (address == NULL) /* Watchpoints are uninteresting */
return;
ALL_BREAKPOINTS (b) ALL_BREAKPOINTS (b)
if (b->enable != disabled && b->address == address) if (b->enable != disabled && b->address == address)
{ {
@ -979,7 +982,11 @@ check_duplicates (address)
Takes as args the three things that every breakpoint must have. Takes as args the three things that every breakpoint must have.
Returns the breakpoint object so caller can set other things. Returns the breakpoint object so caller can set other things.
Does not set the breakpoint number! Does not set the breakpoint number!
Does not print anything. */ Does not print anything.
==> This routine should not be called if there is a chance of later
error(); otherwise it leaves a bogus breakpoint on the chain. Validate
your arguments BEFORE calling this routine! */
static struct breakpoint * static struct breakpoint *
set_raw_breakpoint (sal) set_raw_breakpoint (sal)
@ -1260,19 +1267,28 @@ watch_command (arg, from_tty)
{ {
struct breakpoint *b; struct breakpoint *b;
struct symtab_and_line sal; struct symtab_and_line sal;
struct expression *exp;
struct block *exp_valid_block;
struct value *val;
sal.pc = NULL; sal.pc = NULL;
sal.symtab = NULL; sal.symtab = NULL;
sal.line = 0; sal.line = 0;
/* Parse arguments. */
innermost_block = NULL;
exp = parse_c_expression (arg);
exp_valid_block = innermost_block;
val = evaluate_expression (exp);
release_value (val);
/* Now set up the breakpoint. */
b = set_raw_breakpoint (sal); b = set_raw_breakpoint (sal);
set_breakpoint_count (breakpoint_count + 1); set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count; b->number = breakpoint_count;
innermost_block = NULL; b->exp = exp;
b->exp = parse_c_expression (arg); b->exp_valid_block = exp_valid_block;
b->exp_valid_block = innermost_block; b->val = val;
b->val = evaluate_expression (b->exp);
release_value (b->val);
b->cond = 0; b->cond = 0;
b->cond_string = NULL; b->cond_string = NULL;
mention (b); mention (b);
@ -1986,6 +2002,15 @@ enable_breakpoint (bpt)
check_duplicates (bpt->address); check_duplicates (bpt->address);
if (bpt->val != NULL) if (bpt->val != NULL)
{ {
if (bpt->exp_valid_block != NULL
&& !contained_in (get_selected_block (), bpt->exp_valid_block))
{
printf_filtered ("\
Cannot enable watchpoint %d because the block in which its expression\n\
is valid is not currently in scope.\n", bpt->number);
return;
}
value_free (bpt->val); value_free (bpt->val);
bpt->val = evaluate_expression (bpt->exp); bpt->val = evaluate_expression (bpt->exp);
@ -2189,7 +2214,6 @@ Also a prefix command for deletion of other GDB objects.\n\
The \"unset\" command is also an alias for \"delete\".", The \"unset\" command is also an alias for \"delete\".",
&deletelist, "delete ", 1, &cmdlist); &deletelist, "delete ", 1, &cmdlist);
add_com_alias ("d", "delete", class_breakpoint, 1); add_com_alias ("d", "delete", class_breakpoint, 1);
add_com_alias ("unset", "delete", class_alias, 1);
add_cmd ("breakpoints", class_alias, delete_command, add_cmd ("breakpoints", class_alias, delete_command,
"Delete some breakpoints or auto-display expressions.\n\ "Delete some breakpoints or auto-display expressions.\n\

View File

@ -915,6 +915,7 @@ attach_command (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
dont_repeat (); /* Not for the faint of heart */
target_attach (args, from_tty); target_attach (args, from_tty);
} }
@ -934,6 +935,7 @@ detach_command (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
dont_repeat (); /* Not for the faint of heart */
target_detach (args, from_tty); target_detach (args, from_tty);
} }
@ -949,6 +951,18 @@ float_info (addr_exp)
#endif #endif
} }
struct cmd_list_element *unsetlist = NULL;
/* ARGSUSED */
static void
unset_command (args, from_tty)
char *args;
int from_tty;
{
printf ("\"unset\" must be followed by the name of an unset subcommand.\n");
help_list (unsetlist, "unset ", -1, stdout);
}
void void
_initialize_infcmd () _initialize_infcmd ()
{ {
@ -973,10 +987,14 @@ give the program being debugged. With no arguments, prints the entire\n\
environment to be given to the program.", &showlist); environment to be given to the program.", &showlist);
c->completer = noop_completer; c->completer = noop_completer;
add_prefix_cmd ("unset", no_class, unset_command,
"Complement to certain \"set\" commands",
&unsetlist, "unset ", 0, &cmdlist);
c = add_cmd ("environment", class_run, unset_environment_command, c = add_cmd ("environment", class_run, unset_environment_command,
"Cancel environment variable VAR for the program.\n\ "Cancel environment variable VAR for the program.\n\
This does not affect the program until the next \"run\" command.", This does not affect the program until the next \"run\" command.",
&deletelist); &unsetlist);
c->completer = noop_completer; c->completer = noop_completer;
c = add_cmd ("environment", class_run, set_environment_command, c = add_cmd ("environment", class_run, set_environment_command,

View File

@ -68,6 +68,8 @@ int original_stack_limit;
#endif #endif
char gdbinit[] = GDBINIT_FILENAME; char gdbinit[] = GDBINIT_FILENAME;
#define ALL_CLEANUPS ((struct cleanup *)0)
/* Version number of GDB, as a string. */ /* Version number of GDB, as a string. */
extern char *version; extern char *version;
@ -206,7 +208,7 @@ return_to_top_level ()
bpstat_clear_actions(stop_bpstat); /* Clear queued breakpoint commands */ bpstat_clear_actions(stop_bpstat); /* Clear queued breakpoint commands */
clear_momentary_breakpoints (); clear_momentary_breakpoints ();
disable_current_display (); disable_current_display ();
do_cleanups (0); do_cleanups (ALL_CLEANUPS);
longjmp (to_top_level, 1); longjmp (to_top_level, 1);
} }
@ -536,10 +538,14 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
init_source_path (); init_source_path ();
} }
} }
do_cleanups (ALL_CLEANUPS);
for (i = 0; i < ndir; i++) for (i = 0; i < ndir; i++)
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
directory_command (dirarg[i], 0); directory_command (dirarg[i], 0);
free (dirarg); free (dirarg);
do_cleanups (ALL_CLEANUPS);
if (execarg != NULL if (execarg != NULL
&& symarg != NULL && symarg != NULL
&& strcmp (execarg, symarg) == 0) && strcmp (execarg, symarg) == 0)
@ -561,15 +567,19 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
symbol_file_command (symarg, !batch); symbol_file_command (symarg, !batch);
} }
do_cleanups (ALL_CLEANUPS);
if (corearg != NULL) if (corearg != NULL)
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
core_file_command (corearg, !batch); core_file_command (corearg, !batch);
else if (!setjmp (to_top_level)) else if (!setjmp (to_top_level))
attach_command (corearg, !batch); attach_command (corearg, !batch);
do_cleanups (ALL_CLEANUPS);
if (ttyarg != NULL) if (ttyarg != NULL)
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
tty_command (ttyarg, !batch); tty_command (ttyarg, !batch);
do_cleanups (ALL_CLEANUPS);
#ifdef ADDITIONAL_OPTION_HANDLER #ifdef ADDITIONAL_OPTION_HANDLER
ADDITIONAL_OPTION_HANDLER; ADDITIONAL_OPTION_HANDLER;
@ -591,6 +601,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
if (!inhibit_gdbinit && access (homeinit, R_OK) == 0) if (!inhibit_gdbinit && access (homeinit, R_OK) == 0)
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
source_command (homeinit, 0); source_command (homeinit, 0);
do_cleanups (ALL_CLEANUPS);
/* Do stats; no need to do them elsewhere since we'll only /* Do stats; no need to do them elsewhere since we'll only
need them if homedir is set. Make sure that they are need them if homedir is set. Make sure that they are
@ -615,6 +626,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
if (!inhibit_gdbinit && access (gdbinit, R_OK) == 0) if (!inhibit_gdbinit && access (gdbinit, R_OK) == 0)
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
source_command (gdbinit, 0); source_command (gdbinit, 0);
do_cleanups (ALL_CLEANUPS);
} }
for (i = 0; i < ncmd; i++) for (i = 0; i < ncmd; i++)
@ -624,6 +636,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
read_command_file (stdin); read_command_file (stdin);
else else
source_command (cmdarg[i], !batch); source_command (cmdarg[i], !batch);
do_cleanups (ALL_CLEANUPS);
} }
free (cmdarg); free (cmdarg);
@ -646,6 +659,7 @@ GDB manual (available as on-line info or a printed manual).\n", stderr);
{ {
if (!setjmp (to_top_level)) if (!setjmp (to_top_level))
{ {
do_cleanups (ALL_CLEANUPS); /* Do complete cleanup */
command_loop (); command_loop ();
quit_command ((char *)0, instream == stdin); quit_command ((char *)0, instream == stdin);
} }
@ -710,8 +724,8 @@ execute_command (p, from_tty)
} }
/* ARGSUSED */ /* ARGSUSED */
static void void
do_nothing (foo) command_loop_marker (foo)
int foo; int foo;
{ {
} }
@ -733,7 +747,7 @@ command_loop ()
quit_flag = 0; quit_flag = 0;
if (instream == stdin && stdin_is_tty) if (instream == stdin && stdin_is_tty)
reinitialize_more_filter (); reinitialize_more_filter ();
old_chain = make_cleanup (do_nothing, 0); old_chain = make_cleanup (command_loop_marker, 0);
command = command_line_input (instream == stdin ? prompt : 0, command = command_line_input (instream == stdin ? prompt : 0,
instream == stdin); instream == stdin);
if (command == 0) if (command == 0)
@ -1055,6 +1069,11 @@ catch_termination (sig)
#endif #endif
/* Initialize signal handlers. */ /* Initialize signal handlers. */
static void
do_nothing ()
{
}
static void static void
init_signals () init_signals ()
{ {
@ -1557,7 +1576,7 @@ GDB is free software and you are welcome to distribute copies of it\n\
} }
static void static void
version_info (args, from_tty) show_version (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
@ -1580,7 +1599,7 @@ quit_command (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
if (inferior_pid != 0) if (inferior_pid != 0 && target_has_execution)
{ {
if (query ("The program is running. Quit anyway? ")) if (query ("The program is running. Quit anyway? "))
{ {
@ -1731,6 +1750,7 @@ echo_command (text, from_tty)
else else
fputc (c, stdout); fputc (c, stdout);
} }
fflush (stdout);
} }
/* ARGSUSED */ /* ARGSUSED */
@ -1748,10 +1768,10 @@ dump_me_command (args, from_tty)
/* Functions to manipulate command line editing control variables. */ /* Functions to manipulate command line editing control variables. */
/* Number of commands to print in each call to editing_info. */ /* Number of commands to print in each call to show_commands. */
#define Hist_print 10 #define Hist_print 10
static void static void
editing_info (args, from_tty) show_commands (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
@ -1878,7 +1898,7 @@ show_history (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
cmd_show_list (showhistlist, from_tty); cmd_show_list (showhistlist, from_tty, "");
} }
int info_verbose = 0; /* Default verbose msgs off */ int info_verbose = 0; /* Default verbose msgs off */
@ -2084,7 +2104,7 @@ Without an argument, history expansion is enabled.", &sethistlist),
&showhistlist); &showhistlist);
add_show_from_set add_show_from_set
(add_set_cmd ("write", no_class, var_boolean, (char *)&write_history_p, (add_set_cmd ("save", no_class, var_boolean, (char *)&write_history_p,
"Set saving of the history record on exit.\n\ "Set saving of the history record on exit.\n\
Use \"on\" to enable to enable the saving, and \"off\" to disable it.\n\ Use \"on\" to enable to enable the saving, and \"off\" to disable it.\n\
Without an argument, saving is enabled.", &sethistlist), Without an argument, saving is enabled.", &sethistlist),
@ -2103,11 +2123,10 @@ ie. the number of previous commands to keep a record of.", &sethistlist);
&showhistlist); &showhistlist);
add_show_from_set add_show_from_set
(add_set_cmd ("caution", class_support, var_boolean, (add_set_cmd ("confirm", class_support, var_boolean,
(char *)&caution, (char *)&caution,
"Set expected caution of user.\n\ "Set whether to confirm potentially dangerous operations.",
If on (the default), more warnings are printed, and the user is asked whether\n\ &setlist),
they really want to do various major commands.", &setlist),
&showlist); &showlist);
add_prefix_cmd ("info", class_info, info_command, add_prefix_cmd ("info", class_info, info_command,
@ -2121,7 +2140,9 @@ they really want to do various major commands.", &setlist),
/* Another way to get at the same thing. */ /* Another way to get at the same thing. */
add_info ("set", show_command, "Show all GDB settings."); add_info ("set", show_command, "Show all GDB settings.");
add_info ("editing", editing_info, "Status of command editor."); add_cmd ("commands", no_class, show_commands, "Status of command editor.",
&showlist);
add_info ("version", version_info, "Report what version of GDB this is."); add_cmd ("version", no_class, show_version,
"Report what version of GDB this is.", &showlist);
} }

View File

@ -272,6 +272,7 @@ void
init_malloc () init_malloc ()
{ {
mcheck (malloc_botch); mcheck (malloc_botch);
mtrace ();
} }
#endif /* Have mcheck(). */ #endif /* Have mcheck(). */
@ -1275,20 +1276,20 @@ _initialize_utils ()
(add_set_cmd ("demangle", class_support, var_boolean, (add_set_cmd ("demangle", class_support, var_boolean,
(char *)&demangle, (char *)&demangle,
"Set demangling of encoded C++ names when displaying symbols.", "Set demangling of encoded C++ names when displaying symbols.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("sevenbit-strings", class_support, var_boolean, (add_set_cmd ("sevenbit-strings", class_support, var_boolean,
(char *)&sevenbit_strings, (char *)&sevenbit_strings,
"Set printing of 8-bit characters in strings as \\nnn.", "Set printing of 8-bit characters in strings as \\nnn.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("asm-demangle", class_support, var_boolean, (add_set_cmd ("asm-demangle", class_support, var_boolean,
(char *)&asm_demangle, (char *)&asm_demangle,
"Set demangling of C++ names in disassembly listings.", "Set demangling of C++ names in disassembly listings.",
&setlist), &setprintlist),
&showlist); &showprintlist);
} }

View File

@ -505,19 +505,14 @@ val_print_fields (type, valaddr, stream, format, recurse, pretty, dont_print)
} }
if (TYPE_FIELD_PACKED (type, i)) if (TYPE_FIELD_PACKED (type, i))
{ {
LONGEST val; value v;
char *valp = (char *) & val;
val = unpack_field_as_long (type, valaddr, i); /* Bitfields require special handling, especially due to byte
order problems. */
v = value_from_long (TYPE_FIELD_TYPE (type, i),
unpack_field_as_long (type, valaddr, i));
/* Since we have moved the bitfield into a long, val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
if it is declared with a smaller type, we need to
offset its address *in gdb* to match the type we
are passing to val_print. */
#if HOST_BYTE_ORDER == BIG_ENDIAN
valp += sizeof val - TYPE_LENGTH (TYPE_FIELD_TYPE (type, i));
#endif
val_print (TYPE_FIELD_TYPE (type, i), valp, 0,
stream, format, 0, recurse + 1, pretty); stream, format, 0, recurse + 1, pretty);
} }
else else
@ -1805,49 +1800,77 @@ set_radix (arg, from_tty, c)
set_output_radix (arg, 0, c); set_output_radix (arg, 0, c);
} }
struct cmd_list_element *setprintlist = NULL;
struct cmd_list_element *showprintlist = NULL;
/*ARGSUSED*/
static void
set_print (arg, from_tty)
char *arg;
int from_tty;
{
printf (
"\"set print\" must be followed by the name of a print subcommand.\n");
help_list (setprintlist, "set print ", -1, stdout);
}
/*ARGSUSED*/
static void
show_print (args, from_tty)
char *args;
int from_tty;
{
cmd_show_list (showprintlist, from_tty, "");
}
void void
_initialize_valprint () _initialize_valprint ()
{ {
struct cmd_list_element *c; struct cmd_list_element *c;
add_prefix_cmd ("print", no_class, set_print,
"Generic command for setting how things print.",
&setprintlist, "set print ", 0, &setlist);
add_prefix_cmd ("print", no_class, show_print,
"Generic command for showing print settings.",
&showprintlist, "show print ", 0, &showlist);
add_show_from_set add_show_from_set
(add_set_cmd ("array-max", class_vars, var_uinteger, (char *)&print_max, (add_set_cmd ("elements", no_class, var_uinteger, (char *)&print_max,
"Set limit on string chars or array elements to print.\n\ "Set limit on string chars or array elements to print.\n\
\"set array-max 0\" causes there to be no limit.", \"set print elements 0\" causes there to be no limit.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("prettyprint", class_support, var_boolean, (char *)&prettyprint, (add_set_cmd ("pretty", class_support, var_boolean, (char *)&prettyprint,
"Set prettyprinting of structures.", "Set prettyprinting of structures.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_alias_cmd ("pp", "prettyprint", class_support, 1, &setlist);
add_show_from_set add_show_from_set
(add_set_cmd ("unionprint", class_support, var_boolean, (char *)&unionprint, (add_set_cmd ("union", class_support, var_boolean, (char *)&unionprint,
"Set printing of unions interior to structures.", "Set printing of unions interior to structures.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("vtblprint", class_support, var_boolean, (char *)&vtblprint, (add_set_cmd ("vtbl", class_support, var_boolean, (char *)&vtblprint,
"Set printing of C++ virtual function tables.", "Set printing of C++ virtual function tables.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("arrayprint", class_support, var_boolean, (char *)&arrayprint, (add_set_cmd ("array", class_support, var_boolean, (char *)&arrayprint,
"Set prettyprinting of arrays.", "Set prettyprinting of arrays.",
&setlist), &setprintlist),
&showlist); &showprintlist);
add_show_from_set add_show_from_set
(add_set_cmd ("addressprint", class_support, var_boolean, (char *)&addressprint, (add_set_cmd ("address", class_support, var_boolean, (char *)&addressprint,
"Set printing of addresses.", "Set printing of addresses.",
&setlist), &setprintlist),
&showlist); &showprintlist);
#if 0 #if 0
/* The "show radix" cmd isn't good enough to show two separate values. /* The "show radix" cmd isn't good enough to show two separate values.

View File

@ -26,6 +26,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "gdbcore.h" #include "gdbcore.h"
#include "frame.h" #include "frame.h"
#include "command.h" #include "command.h"
#include "gdbcmd.h"
/* The value-history records all the values printed /* The value-history records all the values printed
by print commands during this session. Each chunk by print commands during this session. Each chunk
@ -286,7 +287,7 @@ clear_value_history ()
} }
static void static void
value_history_info (num_exp, from_tty) show_values (num_exp, from_tty)
char *num_exp; char *num_exp;
int from_tty; int from_tty;
{ {
@ -446,7 +447,7 @@ clear_internalvars ()
} }
static void static void
convenience_info () show_convenience ()
{ {
register struct internalvar *var; register struct internalvar *var;
int varseen = 0; int varseen = 0;
@ -1331,15 +1332,16 @@ set_return_value (val)
void void
_initialize_values () _initialize_values ()
{ {
add_info ("convenience", convenience_info, add_cmd ("convenience", no_class, show_convenience,
"Debugger convenience (\"$foo\") variables.\n\ "Debugger convenience (\"$foo\") variables.\n\
These variables are created when you assign them values;\n\ These variables are created when you assign them values;\n\
thus, \"print $foo=1\" gives \"$foo\" the value 1. Values may be any type.\n\n\ thus, \"print $foo=1\" gives \"$foo\" the value 1. Values may be any type.\n\n\
A few convenience variables are given values automatically:\n\ A few convenience variables are given values automatically:\n\
\"$_\"holds the last address examined with \"x\" or \"info lines\",\n\ \"$_\"holds the last address examined with \"x\" or \"info lines\",\n\
\"$__\" holds the contents of the last address examined with \"x\"."); \"$__\" holds the contents of the last address examined with \"x\".",
&showlist);
add_info ("values", value_history_info, add_cmd ("values", no_class, show_values,
"Elements of value history around item number IDX (or last ten)."); "Elements of value history around item number IDX (or last ten).",
add_info_alias ("history", "values", 0); &showlist);
} }