* Makefile.in: Fix bug I introduced in merging Rich's change.
* infrun.c (child_create_inferior): Use proceed() rather than doing all the same stuff by hand.
This commit is contained in:
parent
d40309c72a
commit
072b552ae1
|
@ -160,7 +160,7 @@ OPCODES = ./../opcodes${subdir}/libopcodes.a
|
||||||
CLIBS = ${BFD_LIB} ${RL_LIB} ${TERMCAP} ${OPCODES} ${MMALLOC_LIB} ${LIBIBERTY} \
|
CLIBS = ${BFD_LIB} ${RL_LIB} ${TERMCAP} ${OPCODES} ${MMALLOC_LIB} ${LIBIBERTY} \
|
||||||
${XM_CLIBS} ${TM_CLIBS} ${NAT_CLIBS}
|
${XM_CLIBS} ${TM_CLIBS} ${NAT_CLIBS}
|
||||||
CDEPS = ${XM_CDEPS} ${TM_CDEPS} ${NAT_CDEPS} \
|
CDEPS = ${XM_CDEPS} ${TM_CDEPS} ${NAT_CDEPS} \
|
||||||
${BFD_LIB} ${RL_LIB} ${TERMCAP} ${OPCODES} ${MMALLOC_LIB} ${LIBIBERTY}
|
${BFD_LIB} ${RL_LIB} ${OPCODES} ${MMALLOC_LIB} ${LIBIBERTY}
|
||||||
|
|
||||||
ADD_FILES = ${REGEX} ${ALLOCA} ${XM_ADD_FILES} ${TM_ADD_FILES} ${NAT_ADD_FILES}
|
ADD_FILES = ${REGEX} ${ALLOCA} ${XM_ADD_FILES} ${TM_ADD_FILES} ${NAT_ADD_FILES}
|
||||||
ADD_DEPS = ${REGEX1} ${ALLOCA1} ${XM_ADD_FILES} ${TM_ADD_FILES} ${NAT_ADD_FILES}
|
ADD_DEPS = ${REGEX1} ${ALLOCA1} ${XM_ADD_FILES} ${TM_ADD_FILES} ${NAT_ADD_FILES}
|
||||||
|
|
283
gdb/infrun.c
283
gdb/infrun.c
|
@ -211,9 +211,25 @@ extern dc_dcontext_t current_context;
|
||||||
|
|
||||||
/* Tables of how to react to signals; the user sets them. */
|
/* Tables of how to react to signals; the user sets them. */
|
||||||
|
|
||||||
static char *signal_stop;
|
static unsigned char *signal_stop;
|
||||||
static char *signal_print;
|
static unsigned char *signal_print;
|
||||||
static char *signal_program;
|
static unsigned char *signal_program;
|
||||||
|
|
||||||
|
#define SET_SIGS(nsigs,sigs,flags) \
|
||||||
|
do { \
|
||||||
|
int signum = (nsigs); \
|
||||||
|
while (signum-- > 0) \
|
||||||
|
if ((sigs)[signum]) \
|
||||||
|
(flags)[signum] = 1; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define UNSET_SIGS(nsigs,sigs,flags) \
|
||||||
|
do { \
|
||||||
|
int signum = (nsigs); \
|
||||||
|
while (signum-- > 0) \
|
||||||
|
if ((sigs)[signum]) \
|
||||||
|
(flags)[signum] = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/* Nonzero if breakpoints are now inserted in the inferior. */
|
/* Nonzero if breakpoints are now inserted in the inferior. */
|
||||||
/* Nonstatic for initialization during xxx_create_inferior. FIXME. */
|
/* Nonstatic for initialization during xxx_create_inferior. FIXME. */
|
||||||
|
@ -666,19 +682,8 @@ child_create_inferior (exec_file, allargs, env)
|
||||||
SOLIB_CREATE_INFERIOR_HOOK (pid);
|
SOLIB_CREATE_INFERIOR_HOOK (pid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Should this perhaps just be a "proceed" call? FIXME */
|
/* Pedal to the metal. Away we go. */
|
||||||
insert_step_breakpoint ();
|
proceed ((CORE_ADDR) -1, 0, 0);
|
||||||
breakpoints_failed = insert_breakpoints ();
|
|
||||||
if (!breakpoints_failed)
|
|
||||||
{
|
|
||||||
breakpoints_inserted = 1;
|
|
||||||
target_terminal_inferior();
|
|
||||||
/* Start the child program going on its first instruction, single-
|
|
||||||
stepping if we need to. */
|
|
||||||
resume (bpstat_should_step (), 0);
|
|
||||||
wait_for_inferior ();
|
|
||||||
normal_stop ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start remote-debugging of a machine over a serial link. */
|
/* Start remote-debugging of a machine over a serial link. */
|
||||||
|
@ -867,8 +872,7 @@ wait_for_inferior ()
|
||||||
stop_func_name = 0;
|
stop_func_name = 0;
|
||||||
/* Don't care about return value; stop_func_start and stop_func_name
|
/* Don't care about return value; stop_func_start and stop_func_name
|
||||||
will both be 0 if it doesn't work. */
|
will both be 0 if it doesn't work. */
|
||||||
(void) find_pc_partial_function (stop_pc, &stop_func_name,
|
find_pc_partial_function (stop_pc, &stop_func_name, &stop_func_start);
|
||||||
&stop_func_start);
|
|
||||||
stop_func_start += FUNCTION_START_OFFSET;
|
stop_func_start += FUNCTION_START_OFFSET;
|
||||||
another_trap = 0;
|
another_trap = 0;
|
||||||
bpstat_clear (&stop_bpstat);
|
bpstat_clear (&stop_bpstat);
|
||||||
|
@ -1631,93 +1635,150 @@ handle_command (args, from_tty)
|
||||||
char *args;
|
char *args;
|
||||||
int from_tty;
|
int from_tty;
|
||||||
{
|
{
|
||||||
register char *p = args;
|
char **argv;
|
||||||
int signum = 0;
|
int digits, wordlen;
|
||||||
register int digits, wordlen;
|
int sigfirst, signum, siglast;
|
||||||
char *nextarg;
|
int allsigs;
|
||||||
|
int nsigs;
|
||||||
|
unsigned char *sigs;
|
||||||
|
struct cleanup *old_chain;
|
||||||
|
|
||||||
if (!args)
|
if (args == NULL)
|
||||||
error_no_arg ("signal to handle");
|
|
||||||
|
|
||||||
while (*p)
|
|
||||||
{
|
{
|
||||||
/* Find the end of the next word in the args. */
|
error_no_arg ("signal to handle");
|
||||||
for (wordlen = 0;
|
}
|
||||||
p[wordlen] && p[wordlen] != ' ' && p[wordlen] != '\t';
|
|
||||||
wordlen++);
|
/* Allocate and zero an array of flags for which signals to handle. */
|
||||||
/* Set nextarg to the start of the word after the one we just
|
|
||||||
found, and null-terminate this one. */
|
nsigs = signo_max () + 1;
|
||||||
if (p[wordlen] == '\0')
|
sigs = (unsigned char *) alloca (nsigs);
|
||||||
nextarg = p + wordlen;
|
memset (sigs, 0, nsigs);
|
||||||
|
|
||||||
|
/* Break the command line up into args. */
|
||||||
|
|
||||||
|
argv = buildargv (args);
|
||||||
|
if (argv == NULL)
|
||||||
|
{
|
||||||
|
nomem (0);
|
||||||
|
}
|
||||||
|
old_chain = make_cleanup (freeargv, (char *) argv);
|
||||||
|
|
||||||
|
/* Walk through the args, looking for signal numbers, signal names, and
|
||||||
|
actions. Signal numbers and signal names may be interspersed with
|
||||||
|
actions, with the actions being performed for all signals cumulatively
|
||||||
|
specified. Signal ranges can be specified as <LOW>-<HIGH>. */
|
||||||
|
|
||||||
|
while (*argv != NULL)
|
||||||
|
{
|
||||||
|
wordlen = strlen (*argv);
|
||||||
|
for (digits = 0; isdigit ((*argv)[digits]); digits++) {;}
|
||||||
|
allsigs = 0;
|
||||||
|
sigfirst = siglast = -1;
|
||||||
|
|
||||||
|
if (wordlen >= 1 && !strncmp (*argv, "all", wordlen))
|
||||||
|
{
|
||||||
|
/* Apply action to all signals except those used by the
|
||||||
|
debugger. Silently skip those. */
|
||||||
|
allsigs = 1;
|
||||||
|
sigfirst = 0;
|
||||||
|
siglast = nsigs - 1;
|
||||||
|
}
|
||||||
|
else if (wordlen >= 1 && !strncmp (*argv, "stop", wordlen))
|
||||||
|
{
|
||||||
|
SET_SIGS (nsigs, sigs, signal_stop);
|
||||||
|
SET_SIGS (nsigs, sigs, signal_print);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 1 && !strncmp (*argv, "ignore", wordlen))
|
||||||
|
{
|
||||||
|
UNSET_SIGS (nsigs, sigs, signal_program);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 2 && !strncmp (*argv, "print", wordlen))
|
||||||
|
{
|
||||||
|
SET_SIGS (nsigs, sigs, signal_print);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 2 && !strncmp (*argv, "pass", wordlen))
|
||||||
|
{
|
||||||
|
SET_SIGS (nsigs, sigs, signal_program);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 3 && !strncmp (*argv, "nostop", wordlen))
|
||||||
|
{
|
||||||
|
UNSET_SIGS (nsigs, sigs, signal_stop);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 3 && !strncmp (*argv, "noignore", wordlen))
|
||||||
|
{
|
||||||
|
SET_SIGS (nsigs, sigs, signal_program);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 4 && !strncmp (*argv, "noprint", wordlen))
|
||||||
|
{
|
||||||
|
UNSET_SIGS (nsigs, sigs, signal_print);
|
||||||
|
UNSET_SIGS (nsigs, sigs, signal_stop);
|
||||||
|
}
|
||||||
|
else if (wordlen >= 4 && !strncmp (*argv, "nopass", wordlen))
|
||||||
|
{
|
||||||
|
UNSET_SIGS (nsigs, sigs, signal_program);
|
||||||
|
}
|
||||||
|
else if (digits > 0)
|
||||||
|
{
|
||||||
|
sigfirst = siglast = atoi (*argv);
|
||||||
|
if ((*argv)[digits] == '-')
|
||||||
|
{
|
||||||
|
siglast = atoi ((*argv) + digits + 1);
|
||||||
|
}
|
||||||
|
if (sigfirst > siglast)
|
||||||
|
{
|
||||||
|
/* Bet he didn't figure we'd think of this case... */
|
||||||
|
signum = sigfirst;
|
||||||
|
sigfirst = siglast;
|
||||||
|
siglast = signum;
|
||||||
|
}
|
||||||
|
if (sigfirst < 0 || sigfirst >= nsigs)
|
||||||
|
{
|
||||||
|
error ("Signal %d not in range 0-%d", sigfirst, nsigs - 1);
|
||||||
|
}
|
||||||
|
if (siglast < 0 || siglast >= nsigs)
|
||||||
|
{
|
||||||
|
error ("Signal %d not in range 0-%d", siglast, nsigs - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((signum = strtosigno (*argv)) != 0)
|
||||||
|
{
|
||||||
|
sigfirst = siglast = signum;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p[wordlen] = '\0';
|
/* Not a number and not a recognized flag word => complain. */
|
||||||
nextarg = p + wordlen + 1;
|
error ("Unrecognized or ambiguous flag word: \"%s\".", *argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (digits = 0; p[digits] >= '0' && p[digits] <= '9'; digits++);
|
/* If any signal numbers or symbol names were found, set flags for
|
||||||
|
which signals to apply actions to. */
|
||||||
|
|
||||||
if (signum == 0)
|
for (signum = sigfirst; signum >= 0 && signum <= siglast; signum++)
|
||||||
{
|
{
|
||||||
/* It is the first argument--must be the signal to operate on. */
|
switch (signum)
|
||||||
if (digits == wordlen)
|
|
||||||
{
|
{
|
||||||
/* Numeric. */
|
case SIGTRAP:
|
||||||
signum = atoi (p);
|
case SIGINT:
|
||||||
if (signum <= 0 || signum > signo_max ())
|
if (!allsigs && !sigs[signum])
|
||||||
{
|
{
|
||||||
p[wordlen] = '\0';
|
if (query ("%s is used by the debugger.\nAre you sure you want to change it? ", strsigno (signum)))
|
||||||
error ("Invalid signal %s given as argument to \"handle\".", p);
|
{
|
||||||
}
|
sigs[signum] = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Symbolic. */
|
printf ("Not confirmed, unchanged.\n");
|
||||||
signum = strtosigno (p);
|
fflush (stdout);
|
||||||
if (signum == 0)
|
}
|
||||||
error ("No such signal \"%s\"", p);
|
}
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
if (signum == SIGTRAP || signum == SIGINT)
|
sigs[signum] = 1;
|
||||||
{
|
break;
|
||||||
if (!query ("%s is used by the debugger.\nAre you sure you want to change it? ", strsigno (signum)))
|
|
||||||
error ("Not confirmed.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Else, if already got a signal number, look for flag words
|
|
||||||
saying what to do for it. */
|
|
||||||
else if (!strncmp (p, "stop", wordlen))
|
|
||||||
{
|
|
||||||
signal_stop[signum] = 1;
|
|
||||||
signal_print[signum] = 1;
|
|
||||||
}
|
|
||||||
else if (wordlen >= 2 && !strncmp (p, "print", wordlen))
|
|
||||||
signal_print[signum] = 1;
|
|
||||||
else if (wordlen >= 2 && !strncmp (p, "pass", wordlen))
|
|
||||||
signal_program[signum] = 1;
|
|
||||||
else if (!strncmp (p, "ignore", wordlen))
|
|
||||||
signal_program[signum] = 0;
|
|
||||||
else if (wordlen >= 3 && !strncmp (p, "nostop", wordlen))
|
|
||||||
signal_stop[signum] = 0;
|
|
||||||
else if (wordlen >= 4 && !strncmp (p, "noprint", wordlen))
|
|
||||||
{
|
|
||||||
signal_print[signum] = 0;
|
|
||||||
signal_stop[signum] = 0;
|
|
||||||
}
|
|
||||||
else if (wordlen >= 4 && !strncmp (p, "nopass", wordlen))
|
|
||||||
signal_program[signum] = 0;
|
|
||||||
else if (wordlen >= 3 && !strncmp (p, "noignore", wordlen))
|
|
||||||
signal_program[signum] = 1;
|
|
||||||
/* Not a number and not a recognized flag word => complain. */
|
|
||||||
else
|
|
||||||
{
|
|
||||||
error ("Unrecognized or ambiguous flag word: \"%s\".", p);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find start of next word. */
|
argv++;
|
||||||
p = nextarg;
|
|
||||||
while (*p == ' ' || *p == '\t') p++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTICE_SIGNAL_HANDLING_CHANGE;
|
NOTICE_SIGNAL_HANDLING_CHANGE;
|
||||||
|
@ -1726,8 +1787,16 @@ handle_command (args, from_tty)
|
||||||
{
|
{
|
||||||
/* Show the results. */
|
/* Show the results. */
|
||||||
sig_print_header ();
|
sig_print_header ();
|
||||||
sig_print_info (signum);
|
for (signum = 0; signum < nsigs; signum++)
|
||||||
|
{
|
||||||
|
if (sigs[signum])
|
||||||
|
{
|
||||||
|
sig_print_info (signum);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print current contents of the tables set by the handle command. */
|
/* Print current contents of the tables set by the handle command. */
|
||||||
|
@ -1800,7 +1869,7 @@ save_inferior_status (inf_status, restore_stack_info)
|
||||||
inf_status->restore_stack_info = restore_stack_info;
|
inf_status->restore_stack_info = restore_stack_info;
|
||||||
inf_status->proceed_to_finish = proceed_to_finish;
|
inf_status->proceed_to_finish = proceed_to_finish;
|
||||||
|
|
||||||
(void) memcpy (inf_status->stop_registers, stop_registers, REGISTER_BYTES);
|
memcpy (inf_status->stop_registers, stop_registers, REGISTER_BYTES);
|
||||||
|
|
||||||
record_selected_frame (&(inf_status->selected_frame_address),
|
record_selected_frame (&(inf_status->selected_frame_address),
|
||||||
&(inf_status->selected_level));
|
&(inf_status->selected_level));
|
||||||
|
@ -1834,7 +1903,7 @@ restore_inferior_status (inf_status)
|
||||||
breakpoint_proceeded = inf_status->breakpoint_proceeded;
|
breakpoint_proceeded = inf_status->breakpoint_proceeded;
|
||||||
proceed_to_finish = inf_status->proceed_to_finish;
|
proceed_to_finish = inf_status->proceed_to_finish;
|
||||||
|
|
||||||
(void) memcpy (stop_registers, inf_status->stop_registers, REGISTER_BYTES);
|
memcpy (stop_registers, inf_status->stop_registers, REGISTER_BYTES);
|
||||||
|
|
||||||
/* The inferior can be gone if the user types "print exit(0)"
|
/* The inferior can be gone if the user types "print exit(0)"
|
||||||
(and perhaps other times). */
|
(and perhaps other times). */
|
||||||
|
@ -1880,18 +1949,26 @@ Specify a signal number as argument to print info on that signal only.");
|
||||||
|
|
||||||
add_com ("handle", class_run, handle_command,
|
add_com ("handle", class_run, handle_command,
|
||||||
"Specify how to handle a signal.\n\
|
"Specify how to handle a signal.\n\
|
||||||
Args are signal number followed by flags.\n\
|
Args are signal numbers and actions to apply to those signals.\n\
|
||||||
Flags allowed are \"stop\", \"print\", \"pass\",\n\
|
Signal numbers may be numeric (ex. 11) or symbolic (ex. SIGSEGV).\n\
|
||||||
\"nostop\", \"noprint\" or \"nopass\".\n\
|
Numeric ranges may be specified with the form LOW-HIGH (ex. 14-21).\n\
|
||||||
Print means print a message if this signal happens.\n\
|
The special arg \"all\" is recognized to mean all signals except those\n\
|
||||||
|
used by the debugger, typically SIGTRAP and SIGINT.\n\
|
||||||
|
Recognized actions include \"stop\", \"nostop\", \"print\", \"noprint\",\n\
|
||||||
|
\"pass\", \"nopass\", \"ignore\", or \"noignore\".\n\
|
||||||
Stop means reenter debugger if this signal happens (implies print).\n\
|
Stop means reenter debugger if this signal happens (implies print).\n\
|
||||||
|
Print means print a message if this signal happens.\n\
|
||||||
Pass means let program see this signal; otherwise program doesn't know.\n\
|
Pass means let program see this signal; otherwise program doesn't know.\n\
|
||||||
|
Ignore is a synonym for nopass and noignore is a synonym for pass.\n\
|
||||||
Pass and Stop may be combined.");
|
Pass and Stop may be combined.");
|
||||||
|
|
||||||
numsigs = signo_max () + 1;
|
numsigs = signo_max () + 1;
|
||||||
signal_stop = xmalloc (sizeof (signal_stop[0]) * numsigs);
|
signal_stop = (unsigned char *)
|
||||||
signal_print = xmalloc (sizeof (signal_print[0]) * numsigs);
|
xmalloc (sizeof (signal_stop[0]) * numsigs);
|
||||||
signal_program = xmalloc (sizeof (signal_program[0]) * numsigs);
|
signal_print = (unsigned char *)
|
||||||
|
xmalloc (sizeof (signal_print[0]) * numsigs);
|
||||||
|
signal_program = (unsigned char *)
|
||||||
|
xmalloc (sizeof (signal_program[0]) * numsigs);
|
||||||
for (i = 0; i < numsigs; i++)
|
for (i = 0; i < numsigs; i++)
|
||||||
{
|
{
|
||||||
signal_stop[i] = 1;
|
signal_stop[i] = 1;
|
||||||
|
|
Loading…
Reference in New Issue