diff options
author | John Gilmore <gnu@cygnus> | 1992-09-19 11:25:52 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1992-09-19 11:25:52 +0000 |
commit | 072b552ae1ae497aab01ec77ba26adf4dc32031e (patch) | |
tree | 57121406d31e50d0361eb675fe3ca6108887ca35 /gdb | |
parent | d40309c72a376a9c18434aa94c6c9a28adf3f424 (diff) | |
download | gdb-072b552ae1ae497aab01ec77ba26adf4dc32031e.zip gdb-072b552ae1ae497aab01ec77ba26adf4dc32031e.tar.gz gdb-072b552ae1ae497aab01ec77ba26adf4dc32031e.tar.bz2 |
* 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.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/infrun.c | 267 |
2 files changed, 173 insertions, 96 deletions
diff --git a/gdb/Makefile.in b/gdb/Makefile.in index d459af3..a5f4e2d 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -160,7 +160,7 @@ OPCODES = ./../opcodes${subdir}/libopcodes.a CLIBS = ${BFD_LIB} ${RL_LIB} ${TERMCAP} ${OPCODES} ${MMALLOC_LIB} ${LIBIBERTY} \ ${XM_CLIBS} ${TM_CLIBS} ${NAT_CLIBS} 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_DEPS = ${REGEX1} ${ALLOCA1} ${XM_ADD_FILES} ${TM_ADD_FILES} ${NAT_ADD_FILES} diff --git a/gdb/infrun.c b/gdb/infrun.c index e8e4a7c..a6af733 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -211,9 +211,25 @@ extern dc_dcontext_t current_context; /* Tables of how to react to signals; the user sets them. */ -static char *signal_stop; -static char *signal_print; -static char *signal_program; +static unsigned char *signal_stop; +static unsigned char *signal_print; +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. */ /* Nonstatic for initialization during xxx_create_inferior. FIXME. */ @@ -666,19 +682,8 @@ child_create_inferior (exec_file, allargs, env) SOLIB_CREATE_INFERIOR_HOOK (pid); #endif - /* Should this perhaps just be a "proceed" call? FIXME */ - insert_step_breakpoint (); - 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 (); - } + /* Pedal to the metal. Away we go. */ + proceed ((CORE_ADDR) -1, 0, 0); } /* Start remote-debugging of a machine over a serial link. */ @@ -867,8 +872,7 @@ wait_for_inferior () stop_func_name = 0; /* Don't care about return value; stop_func_start and stop_func_name will both be 0 if it doesn't work. */ - (void) find_pc_partial_function (stop_pc, &stop_func_name, - &stop_func_start); + find_pc_partial_function (stop_pc, &stop_func_name, &stop_func_start); stop_func_start += FUNCTION_START_OFFSET; another_trap = 0; bpstat_clear (&stop_bpstat); @@ -1631,93 +1635,150 @@ handle_command (args, from_tty) char *args; int from_tty; { - register char *p = args; - int signum = 0; - register int digits, wordlen; - char *nextarg; + char **argv; + int digits, wordlen; + int sigfirst, signum, siglast; + int allsigs; + int nsigs; + unsigned char *sigs; + struct cleanup *old_chain; + + if (args == NULL) + { + error_no_arg ("signal to handle"); + } - if (!args) - error_no_arg ("signal to handle"); + /* Allocate and zero an array of flags for which signals to handle. */ + + nsigs = signo_max () + 1; + sigs = (unsigned char *) alloca (nsigs); + memset (sigs, 0, nsigs); - while (*p) + /* Break the command line up into args. */ + + argv = buildargv (args); + if (argv == NULL) { - /* Find the end of the next word in the args. */ - for (wordlen = 0; - p[wordlen] && p[wordlen] != ' ' && p[wordlen] != '\t'; - wordlen++); - /* Set nextarg to the start of the word after the one we just - found, and null-terminate this one. */ - if (p[wordlen] == '\0') - nextarg = p + wordlen; - else - { - p[wordlen] = '\0'; - nextarg = p + wordlen + 1; - } - + nomem (0); + } + old_chain = make_cleanup (freeargv, (char *) argv); - for (digits = 0; p[digits] >= '0' && p[digits] <= '9'; digits++); + /* 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>. */ - if (signum == 0) + 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) { - /* It is the first argument--must be the signal to operate on. */ - if (digits == wordlen) + sigfirst = siglast = atoi (*argv); + if ((*argv)[digits] == '-') { - /* Numeric. */ - signum = atoi (p); - if (signum <= 0 || signum > signo_max ()) - { - p[wordlen] = '\0'; - error ("Invalid signal %s given as argument to \"handle\".", p); - } + siglast = atoi ((*argv) + digits + 1); } - else + if (sigfirst > siglast) { - /* Symbolic. */ - signum = strtosigno (p); - if (signum == 0) - error ("No such signal \"%s\"", p); + /* Bet he didn't figure we'd think of this case... */ + signum = sigfirst; + sigfirst = siglast; + siglast = signum; } - - if (signum == SIGTRAP || signum == SIGINT) + if (sigfirst < 0 || sigfirst >= nsigs) + { + error ("Signal %d not in range 0-%d", sigfirst, nsigs - 1); + } + if (siglast < 0 || siglast >= nsigs) { - if (!query ("%s is used by the debugger.\nAre you sure you want to change it? ", strsigno (signum))) - error ("Not confirmed."); + error ("Signal %d not in range 0-%d", siglast, nsigs - 1); } } - /* Else, if already got a signal number, look for flag words - saying what to do for it. */ - else if (!strncmp (p, "stop", wordlen)) + else if ((signum = strtosigno (*argv)) != 0) { - signal_stop[signum] = 1; - signal_print[signum] = 1; + sigfirst = siglast = signum; } - 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)) + else { - signal_print[signum] = 0; - signal_stop[signum] = 0; + /* Not a number and not a recognized flag word => complain. */ + error ("Unrecognized or ambiguous flag word: \"%s\".", *argv); } - 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 + + /* If any signal numbers or symbol names were found, set flags for + which signals to apply actions to. */ + + for (signum = sigfirst; signum >= 0 && signum <= siglast; signum++) { - error ("Unrecognized or ambiguous flag word: \"%s\".", p); + switch (signum) + { + case SIGTRAP: + case SIGINT: + if (!allsigs && !sigs[signum]) + { + if (query ("%s is used by the debugger.\nAre you sure you want to change it? ", strsigno (signum))) + { + sigs[signum] = 1; + } + else + { + printf ("Not confirmed, unchanged.\n"); + fflush (stdout); + } + } + break; + default: + sigs[signum] = 1; + break; + } } - /* Find start of next word. */ - p = nextarg; - while (*p == ' ' || *p == '\t') p++; + argv++; } NOTICE_SIGNAL_HANDLING_CHANGE; @@ -1726,8 +1787,16 @@ handle_command (args, from_tty) { /* Show the results. */ 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. */ @@ -1800,7 +1869,7 @@ save_inferior_status (inf_status, restore_stack_info) inf_status->restore_stack_info = restore_stack_info; 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), &(inf_status->selected_level)); @@ -1834,7 +1903,7 @@ restore_inferior_status (inf_status) breakpoint_proceeded = inf_status->breakpoint_proceeded; 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)" (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, "Specify how to handle a signal.\n\ -Args are signal number followed by flags.\n\ -Flags allowed are \"stop\", \"print\", \"pass\",\n\ - \"nostop\", \"noprint\" or \"nopass\".\n\ -Print means print a message if this signal happens.\n\ +Args are signal numbers and actions to apply to those signals.\n\ +Signal numbers may be numeric (ex. 11) or symbolic (ex. SIGSEGV).\n\ +Numeric ranges may be specified with the form LOW-HIGH (ex. 14-21).\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\ +Print means print a message if this signal happens.\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."); numsigs = signo_max () + 1; - signal_stop = xmalloc (sizeof (signal_stop[0]) * numsigs); - signal_print = xmalloc (sizeof (signal_print[0]) * numsigs); - signal_program = xmalloc (sizeof (signal_program[0]) * numsigs); + signal_stop = (unsigned char *) + xmalloc (sizeof (signal_stop[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++) { signal_stop[i] = 1; |