[RFA]: issue warnings for frame offenses
Jeff Johnston
jjohnstn@redhat.com
Thu Nov 4 16:29:00 GMT 2004
Andrew Cagney wrote:
> Joel Brobecker wrote:
>
>>> The attached patch changes a few backtrace termination scenarios in
>>> frame.c to issue a warning and terminate the backtrace rather than
>>> use the error() function. The change is being made to help out
>>> end-users that use macros with backtraces in them. At present, there
>>> a number of platforms where backtraces through assembler code (e.g.
>>> glibc thread creation) cause backtraces to get somewhat lost. When
>>> the frame code issues the error, any macro issuing the backtrace is
>>> terminated. If an end-user is applying such a macro to all threads,
>>> it ends prematurely for no good reason. With the change, the message
>>> is still issued and the backtrace is stopped.
>>
>>
>>
>> Interestingly, a customer of ours reported about a year or two ago
>> a situation similar to this. They were using the backtrace command
>> inside breakpoint commands looking like this:
>>
>> break somewhere
>> commands
>> backtrace
>> continue
>> end
>>
>> The idea was that they wanted to see how the program would get to
>> a certain piece of code (in our case raise an exception), and how
>> often. But they didn't want to stop the execution and start debugging.
>> But the unwinder would sometimes be confused, and an error would be
>> raised, and the commands execution would be aborted.
>>
>> We modified the debugger in a rather radical way: We wrapped the
>> backtrace command under control of the catch_error() routine, and
>> transformed any error into a warning. We didn't feel that this would
>> be interesting for the FSF tree, but maybe our assesment was wrong.
>> Let us know if this approach would also be useful, in which case
>> we'll be happy to contribute it.
>
>
> (Somewhere there is a try / finally command patch, just waiting to be
> integrated.)
>
> How does the following sound:
>
Sounds fine. I'll start working on it. I assume you meant non_fatal_error
below for the new function that issues the quit.
> - add a new fatal_error():
>
> There should be a new error mechanism that throws a QUIT instead of
> ERROR. Code should not normally be catching QUIT (much unfortunately
> does). A fatal error is things like: syntax error; no target; lost
> target. Things like a memory access violation though are not fatal.
>
> - think about stopping code catching and then discarding QUIT
> Grep for RETURN_MASK_ALL in the sources - it should be RETURN_MASK_ERROR
> :-/
>
> - modify the backtrace code to catch ERROR, but not QUIT
>
> Along the lines of Joel's suggestion, the backtrace command should catch
> ERROR (but should not catch QUIT). That way simple problems don't abort
> the script but fatal ones do.
>
>
> Why?
>
> Lets try to categorize commands as being of two types:
>
> - display
> These commands print information from the inferior. In general they
> don't cause an error - for instance:
> (gdb) print *(char *)0
> $1 = <memory error>
> (yes I know, this isn't currently the case :-)
>
> - modify
> These commands try to change the state of GDB or the inferior. In
> general problems do lead to an error as not performing the operation
> puts things into a relatively undefined state.
>
> (The pedant will realize that ``(gdb) print (*(char *)0)++'' can be
> thought of as a `modify', lets ignore that in this simple model :-).
>
> The breakpoint command falls into the ``display'' category.
> The up and run commands fall into the ``modify'' category.
>
>
> Why not s/error/warning/:
>
> I'm trying to avoid a bigger mess. Given a corrupt stack, I'm pretty
> sure that this:
>
> (gdb) up
> Previous frame identical to this frame (corrupt stack?)
> (gdb) up
> Initial frame selected; you cannot go up.
>
> (the same error should be printed both times) and this:
>
> (gdb) frame 0x12345678
> Previous frame identical to this frame (corrupt stack?)
> (gdb) frame 0x12345678
> #1 0x1005e5f8 in fprintf_filtered ....
>
> (the error should be completely suppressed) occur!
>
> Fixing this would mean more radical (but still overdue) changes to both
> the stack and frame code.
>
> My guess is publish a method:
>
> int safe_get_prev_frame (this_frame, &prev_frame, &error_if_nonnull)
>
> and use that.
>
> How, if you're up for a challenge.
>
> Andrew
>
More information about the Gdb-patches
mailing list