[RFA]: issue warnings for frame offenses
Andrew Cagney
cagney@gnu.org
Fri Nov 5 15:49:00 GMT 2004
Jeff Johnston wrote:
> Andrew,
>
> The following updated patch implements your suggestion of having a new
> error routine that throw RETURN_QUIT. The backtrace command is now
> protected with a catch_errors call. I did not change other existing
> calls to catch_errors to use RETURN_MASK_ERROR instead of RETURN_MASK_ALL.
>
> Ok or is there something I have missed?
No.
With regard to s/RETURN_MASK_ALL/RETURN_MASK_ERROR/ that while more
correct gives me the willies, so yes we can worry about that later.
I need to think about s/RETURN_QUIT/RETURN_FATAL/.
I'm just trying to decide which of:
fatal_error OR fatal
and
vfatal_error, fatal_verror, and vfatal
are better. Having seen the code, I kind of prefer the shorter "fatal"
and "vfatal". Ok with that.
This should be mentioned in NEWS, I guess with "thread apply all bt" now
"works".
thanks,
Andrew
> -- Jeff J.
>
> 2004-11-04 Jeff Johnston <jjohnstn@redhat.com>
>
> * defs.h (fatal_error, vfatal_error): New function prototypes.
> * stack.c (backtrace_command_stub): Stub to call
> backtrace_command_1
> via catch_errors.
> (backtrace_command): Change to call backtrace_command_stub via
> catch_errors instead of calling backtrace_command_1 directly.
> (backtrace_full_command): Ditto.
> * utils.c (error_stream_1): New static function.
> (verror): Change to call error_stream_1 instead of error_stream.
> (error_stream): Call error_stream_1 with RETURN_ERROR argument.
> (vfatal_error, fatal_error): New functions.
>
>
> ------------------------------------------------------------------------
>
> Index: defs.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/defs.h,v
> retrieving revision 1.170
> diff -u -p -r1.170 defs.h
> --- defs.h 12 Oct 2004 10:06:14 -0000 1.170
> +++ defs.h 4 Nov 2004 22:55:02 -0000
> @@ -911,6 +911,10 @@ extern char *error_last_message (void);
> /* Output arbitrary error message. */
> extern void error_output_message (char *pre_print, char *msg);
>
> +extern NORETURN void vfatal_error (const char *fmt, va_list ap) ATTR_NORETURN;
> +
> +extern NORETURN void fatal_error (const char *fmt, ...) ATTR_NORETURN ATTR_FORMAT (printf, 1, 2);
> +
> extern NORETURN void internal_verror (const char *file, int line,
> const char *, va_list ap) ATTR_NORETURN;
>
> Index: stack.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/stack.c,v
> retrieving revision 1.115
> diff -u -p -r1.115 stack.c
> --- stack.c 30 Oct 2004 21:16:10 -0000 1.115
> +++ stack.c 4 Nov 2004 22:55:03 -0000
> @@ -1204,6 +1204,22 @@ backtrace_command_1 (char *count_exp, in
> printf_filtered ("(More stack frames follow...)\n");
> }
>
> +struct backtrace_command_args
> + {
> + char *count_exp;
> + int show_locals;
> + int from_tty;
> + };
> +
> +/* Stub to call backtrace_command_1 by way of an error catcher. */
> +static int
> +backtrace_command_stub (void *data)
> +{
> + struct backtrace_command_args *args = (struct backtrace_command_args *)data;
> + backtrace_command_1 (args->count_exp, args->show_locals, args->from_tty);
> + return 0;
> +}
> +
> static void
> backtrace_command (char *arg, int from_tty)
> {
> @@ -1211,6 +1227,7 @@ backtrace_command (char *arg, int from_t
> char **argv = (char **) NULL;
> int argIndicatingFullTrace = (-1), totArgLen = 0, argc = 0;
> char *argPtr = arg;
> + struct backtrace_command_args btargs;
>
> if (arg != (char *) NULL)
> {
> @@ -1260,7 +1277,10 @@ backtrace_command (char *arg, int from_t
> }
> }
>
> - backtrace_command_1 (argPtr, (argIndicatingFullTrace >= 0), from_tty);
> + btargs.count_exp = argPtr;
> + btargs.show_locals = (argIndicatingFullTrace >= 0);
> + btargs.from_tty = from_tty;
> + catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
>
> if (argIndicatingFullTrace >= 0 && totArgLen > 0)
> xfree (argPtr);
> @@ -1273,7 +1293,11 @@ static void backtrace_full_command (char
> static void
> backtrace_full_command (char *arg, int from_tty)
> {
> - backtrace_command_1 (arg, 1, from_tty);
> + struct backtrace_command_args btargs;
> + btargs.count_exp = arg;
> + btargs.show_locals = 1;
> + btargs.from_tty = from_tty;
> + catch_errors (backtrace_command_stub, (char *)&btargs, "", RETURN_MASK_ERROR);
> }
>
>
> Index: utils.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/utils.c,v
> retrieving revision 1.137
> diff -u -p -r1.137 utils.c
> --- utils.c 30 Sep 2004 19:57:54 -0000 1.137
> +++ utils.c 4 Nov 2004 22:55:03 -0000
> @@ -104,6 +104,9 @@ static void prompt_for_continue (void);
> static void set_screen_size (void);
> static void set_width (void);
>
> +static NORETURN void error_stream_1 (struct ui_file *stream,
> + enum return_reason reason) ATTR_NORETURN;
> +
> /* Chain of cleanup actions established with make_cleanup,
> to be executed if an error happens. */
>
> @@ -620,7 +623,7 @@ verror (const char *string, va_list args
> struct ui_file *tmp_stream = mem_fileopen ();
> make_cleanup_ui_file_delete (tmp_stream);
> vfprintf_unfiltered (tmp_stream, string, args);
> - error_stream (tmp_stream);
> + error_stream_1 (tmp_stream, RETURN_ERROR);
> }
>
> NORETURN void
> @@ -632,6 +635,28 @@ error (const char *string, ...)
> va_end (args);
> }
>
> +/* Print an error message and quit.
> + The first argument STRING is the error message, used as a fprintf string,
> + and the remaining args are passed as arguments to it. */
> +
> +NORETURN void
> +vfatal_error (const char *string, va_list args)
> +{
> + struct ui_file *tmp_stream = mem_fileopen ();
> + make_cleanup_ui_file_delete (tmp_stream);
> + vfprintf_unfiltered (tmp_stream, string, args);
> + error_stream_1 (tmp_stream, RETURN_QUIT);
> +}
> +
> +NORETURN void
> +fatal_error (const char *string, ...)
> +{
> + va_list args;
> + va_start (args, string);
> + vfatal_error (string, args);
> + va_end (args);
> +}
> +
> static void
> do_write (void *data, const char *buffer, long length_buffer)
> {
> @@ -670,8 +695,8 @@ error_output_message (char *pre_print, c
> fprintf_filtered (gdb_stderr, "\n");
> }
>
> -NORETURN void
> -error_stream (struct ui_file *stream)
> +static NORETURN void
> +error_stream_1 (struct ui_file *stream, enum return_reason reason)
> {
> if (deprecated_error_begin_hook)
> deprecated_error_begin_hook ();
> @@ -690,7 +715,13 @@ error_stream (struct ui_file *stream)
> ui_file_put (stream, do_write, gdb_stderr);
> fprintf_filtered (gdb_stderr, "\n");
>
> - throw_exception (RETURN_ERROR);
> + throw_exception (reason);
> +}
> +
> +NORETURN void
> +error_stream (struct ui_file *stream)
> +{
> + error_stream_1 (stream, RETURN_ERROR);
> }
>
> /* Get the last error message issued by gdb */
More information about the Gdb-patches
mailing list