2000-02-23 Fernando Nasser <fnasser@cygnus.com>

* infcmd.c (run_stack_dummy): Do not pop frame on random signal.
        * valops.c (_initialize_valops): Add command "set unwindonsignal".
        (hand_function_call): Test for unwind_on_signal and act accordingly.
This commit is contained in:
Fernando Nasser 2000-02-23 15:53:33 +00:00
parent 5b93d8bb51
commit 242bfc55af
3 changed files with 59 additions and 19 deletions

View File

@ -1,3 +1,9 @@
2000-02-23 Fernando Nasser <fnasser@cygnus.com>
* infcmd.c (run_stack_dummy): Do not pop frame on random signal.
* valops.c (_initialize_valops): Add command "set unwindonsignal".
(hand_function_call): Test for unwind_on_signal and act accordingly.
Wed Feb 23 12:58:46 2000 Andrew Cagney <cagney@b1.cygnus.com>
* gdbarch.sh (dis_asm_read_memory): Change LEN to unsigned long.

View File

@ -926,20 +926,12 @@ run_stack_dummy (addr, buffer)
discard_cleanups (old_cleanups);
/* We can stop during an inferior call because a signal is received. */
if (stopped_by_random_signal)
{
/* If the inferior execution fails we need to restore our
stack. It is not done by proceed() in this case. */
/* Pop the empty frame that contains the stack dummy.
POP_FRAME ends with a setting of the current frame, so we
can use that next. */
POP_FRAME;
return 1;
}
return 1;
/* We may also stop prematurely because we hit a breakpoint in the
called routine. We do not pop the frame as the user may wish
to single step or continue from there. */
called routine. */
if (!stop_stack_dummy)
return 2;

View File

@ -75,6 +75,13 @@ static int auto_abandon = 0;
#endif
int overload_resolution = 0;
/* This boolean tells what gdb should do if a signal is received while in
a function called from gdb (call dummy). If set, gdb unwinds the stack
and restore the context to what as it was before the call.
The default is to stop in the frame where the signal was received. */
int unwind_on_signal_p = 0;
@ -1726,16 +1733,42 @@ You must use a pointer to function type variable. Command ignored.", arg_name);
/* We stopped inside the FUNCTION because of a random signal.
Further execution of the FUNCTION is not allowed. */
/* In this case, we must do the cleanups because we don't
want the dummy anymore (the dummy frame has been poped already. */
do_cleanups (old_chain);
if (unwind_on_signal_p)
{
/* The user wants the context restored. */
/* FIXME: Insert a bunch of wrap_here; name can be very long if it's
a C++ name with arguments and stuff. */
error ("\
The program being debugged stopped while in a function called from GDB.\n\
/* We must get back to the frame we were before the dummy call. */
POP_FRAME;
/* FIXME: Insert a bunch of wrap_here; name can be very long if it's
a C++ name with arguments and stuff. */
error ("\
The program being debugged was signaled while in a function called from GDB.\n\
GDB has restored the context to what it was before the call.\n\
To change this behavior use \"set unwindonsignal off\"\n\
Evaluation of the expression containing the function (%s) will be abandoned.",
name);
name);
}
else
{
/* The user wants to stay in the frame where we stopped (default).*/
/* If we did the cleanups, we would print a spurious error
message (Unable to restore previously selected frame),
would write the registers from the inf_status (which is
wrong), and would do other wrong things. */
discard_cleanups (old_chain);
discard_inferior_status (inf_status);
/* FIXME: Insert a bunch of wrap_here; name can be very long if it's
a C++ name with arguments and stuff. */
error ("\
The program being debugged was signaled while in a function called from GDB.\n\
GDB remains in the frame where the signal was received.\n\
To change this behavior use \"set unwindonsignal on\"\n\
Evaluation of the expression containing the function (%s) will be abandoned.",
name);
}
}
if (rc == 2)
@ -3562,4 +3595,13 @@ _initialize_valops ()
&showlist);
overload_resolution = 1;
add_show_from_set (
add_set_cmd ("unwindonsignal", no_class, var_boolean,
(char *) &unwind_on_signal_p,
"Set unwinding of stack if a signal is received while in a call dummy.\n\
The unwindonsignal lets the user determine what gdb should do if a signal\n\
is received while in a function called from gdb (call dummy). If set, gdb\n\
unwinds the stack and restore the context to what as it was before the call.\n\
The default is to stop in the frame where the signal was received.", &setlist),
&showlist);
}