From: Jeff Johnston <jjohnstn@redhat.com>
To: Andrew Cagney <cagney@gnu.org>
Cc: Joel Brobecker <brobecker@gnat.com>, gdb-patches@sources.redhat.com
Subject: Re: [RFA]: issue warnings for frame offenses
Date: Fri, 05 Nov 2004 20:35:00 -0000 [thread overview]
Message-ID: <418BE3E9.6060301@redhat.com> (raw)
In-Reply-To: <418BA0F8.7000703@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1719 bytes --]
Andrew Cagney wrote:
> 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.
>
Ok, change made and attached patch has been committed.
2004-11-05 Jeff Johnston <jjohnstn@redhat.com>
* defs.h (fatal, vfatal): 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, fatal): New functions.
> This should be mentioned in NEWS, I guess with "thread apply all bt" now
> "works".
>
I'll post a change for this as well as a test case I have.
-- Jeff J.
[-- Attachment #2: backtrace.patch2 --]
[-- Type: text/plain, Size: 4972 bytes --]
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 5 Nov 2004 20:29:57 -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 (const char *fmt, va_list ap) ATTR_NORETURN;
+
+extern NORETURN void fatal (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.117
diff -u -p -r1.117 stack.c
--- stack.c 5 Nov 2004 18:58:29 -0000 1.117
+++ stack.c 5 Nov 2004 20:29:57 -0000
@@ -1218,6 +1218,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)
{
@@ -1225,6 +1241,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)
{
@@ -1274,7 +1291,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);
@@ -1287,7 +1307,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);
}
\f
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 5 Nov 2004 20:29:58 -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 (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 (const char *string, ...)
+{
+ va_list args;
+ va_start (args, string);
+ vfatal (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 */
prev parent reply other threads:[~2004-11-05 20:35 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-10-26 21:22 Jeff Johnston
2004-10-26 21:30 ` Joel Brobecker
2004-11-04 0:09 ` Andrew Cagney
2004-11-04 16:29 ` Jeff Johnston
2004-11-04 18:28 ` Jeff Johnston
2004-11-04 23:06 ` Jeff Johnston
2004-11-05 15:49 ` Andrew Cagney
2004-11-05 20:35 ` Jeff Johnston [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=418BE3E9.6060301@redhat.com \
--to=jjohnstn@redhat.com \
--cc=brobecker@gnat.com \
--cc=cagney@gnu.org \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox