From 242bfc55af827ff13be5ceddd636f3a53fee1c55 Mon Sep 17 00:00:00 2001 From: Fernando Nasser Date: Wed, 23 Feb 2000 15:53:33 +0000 Subject: [PATCH] 2000-02-23 Fernando Nasser * 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. --- gdb/ChangeLog | 6 ++++++ gdb/infcmd.c | 14 +++---------- gdb/valops.c | 58 ++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 59 insertions(+), 19 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 81fdc39d893..c861278f201 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2000-02-23 Fernando Nasser + + * 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 * gdbarch.sh (dis_asm_read_memory): Change LEN to unsigned long. diff --git a/gdb/infcmd.c b/gdb/infcmd.c index fb439849ea6..84bc9204bbf 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -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; diff --git a/gdb/valops.c b/gdb/valops.c index 5fd0fd8c1ed..5dc6b1e7fe7 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -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); } -- 2.30.2