This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFA: unwindonsignal (REPOST)


Fernando Nasser wrote:
> 
> As suggested by Elena, the command was moved to valops.c
> 
> 2000-02-18  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.

Fine with me.

Just some random thoughts:

I wish GDB didn't use this ``unwindonsignal'' as the nameing schema. 
unwind-on-signal is so much more readable (but sigh, thats the
convention).

As GUI's come to the for.  GDB is probably going to need two interfaces
for this - one which always bails GDB out and one which never bails GDB
out.  That way the GUI could do things like ``evaluate expression'' with
out the user being confused by this sudden context switch while at the
same time allowing the CLI user to achieve the more powerful behavour

	enjoy,
		Andrew



> --
> Fernando Nasser
> Red Hat - Toronto                       E-Mail:  fnasser@cygnus.com
> 2323 Yonge Street, Suite #300           Tel:  416-482-2661 ext. 311
> Toronto, Ontario   M4P 2C9              Fax:  416-482-6299
> 
> Index: valops.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/valops.c,v
> retrieving revision 1.1.1.11
> diff -c -p -r1.1.1.11 valops.c
> *** valops.c    2000/02/01 03:19:12     1.1.1.11
> --- valops.c    2000/02/21 20:15:48
> *************** static int auto_abandon = 0;
> *** 84,89 ****
> --- 83,95 ----
>   #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;
> 
> 
> 
> *************** You must use a pointer to function type
> *** 1695,1710 ****
>         /* 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);
> 
> !       /* 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\
>   Evaluation of the expression containing the function (%s) will be
> abandoned.",
> !              name);
>         }
> 
>       if (rc == 2)
> --- 1701,1746 ----
>         /* We stopped inside the FUNCTION because of a random signal.
>            Further execution of the FUNCTION is not allowed. */
> 
> !         if (unwind_on_signal_p)
> !         {
> !           /* The user wants the context restored. */
> 
> !             /* We must get back to the frame we were before the dummy
> call. */
> !             POP_FRAME;
> !
> !           /* In this case, we must do the cleanups because we don't
> !              want the dummy anymore */
> !           do_cleanups (old_chain);
> !
> !           /* 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);
> !         }
> !       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)
> *************** _initialize_valops ()
> *** 3531,3534 ****
> --- 3567,3579 ----
>        &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);
>   }
> Index: infcmd.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/infcmd.c,v
> retrieving revision 1.1.1.17
> diff -c -p -r1.1.1.17 infcmd.c
> *** infcmd.c    2000/02/03 04:14:31     1.1.1.17
> --- infcmd.c    2000/02/21 20:15:48
> *************** run_stack_dummy (addr, buffer)
> *** 926,945 ****
> 
>     discard_cleanups (old_cleanups);
> 
>     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;
> !     }
> 
>     /* 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. */
>     if (!stop_stack_dummy)
>       return 2;
> 
> --- 926,937 ----
> 
>     discard_cleanups (old_cleanups);
> 
> +   /* We can stop during an inferior call because a signal is received.
> */
>     if (stopped_by_random_signal)
> !     return 1;
> 
>     /* We may also stop prematurely because we hit a breakpoint in the
> !      called routine. */
>     if (!stop_stack_dummy)
>       return 2;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]