aboutsummaryrefslogtreecommitdiff
path: root/gdb/valops.c
diff options
context:
space:
mode:
authorFernando Nasser <fnasser@redhat.com>2000-02-23 15:53:33 +0000
committerFernando Nasser <fnasser@redhat.com>2000-02-23 15:53:33 +0000
commit242bfc55af827ff13be5ceddd636f3a53fee1c55 (patch)
treea877521c0b6c69cbb720d2180fee82ceb6ebf164 /gdb/valops.c
parent5b93d8bb517c1f5715435dcf627a8642f557ddb2 (diff)
downloadbinutils-242bfc55af827ff13be5ceddd636f3a53fee1c55.zip
binutils-242bfc55af827ff13be5ceddd636f3a53fee1c55.tar.gz
binutils-242bfc55af827ff13be5ceddd636f3a53fee1c55.tar.bz2
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.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r--gdb/valops.c58
1 files changed, 50 insertions, 8 deletions
diff --git a/gdb/valops.c b/gdb/valops.c
index 5fd0fd8..5dc6b1e 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);
}