[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