This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: frame.c assertion failure
On May 7, 3:25pm, Kevin Buettner wrote:
../../src/gdb/frame.c:2083: internal-error: get_frame_type:
Assertion `frame->unwind->type != UNKNOWN_FRAME' failed.
FWIW, this problem is "fixed" by backing out the following change:
2003-04-16 Andrew Cagney <cagney@redhat.com>
* frame.c (get_prev_frame): Do not initialize "unwind" or "type",
update comments.
(get_frame_type): Initialize unwind and type when needed.
(get_frame_id, frame_register_unwind): Ditto.
The code is:
enum frame_type
get_frame_type (struct frame_info *frame)
{
/* Some targets still don't use [generic] dummy frames. Catch them
here. */
if (!DEPRECATED_USE_GENERIC_DUMMY_FRAMES
&& deprecated_frame_in_dummy (frame))
return DUMMY_FRAME;
if (frame->unwind == NULL)
{
I'd only expect the d10v to execute the following.
/* Initialize the frame's unwinder because it is that which
provides the frame's type. */
frame->unwind = frame_unwind_find_by_pc (current_gdbarch,
get_frame_pc (frame));
For the d10v, this never returns legacy_saved_regs_unwinder and so ....
/* FIXME: cagney/2003-04-02: Rather than storing the frame's
type in the frame, the unwinder's type should be returned
directly. Unfortunatly, legacy code, called by
legacy_get_prev_frame, explicitly set the frames type using
the method deprecated_set_frame_type(). */
gdb_assert (frame->unwind->type != UNKNOWN_FRAME);
... this can never be UNKNOWN_FRAME.
frame->type = frame->unwind->type;
}
if (frame->type == UNKNOWN_FRAME)
return NORMAL_FRAME;
else
return frame->type;
}
What should happen is:
int
legacy_frame_p (struct gdbarch *current_gdbarch)
{
return (DEPRECATED_INIT_FRAME_PC_P ()
|| DEPRECATED_INIT_FRAME_PC_FIRST_P ()
|| DEPRECATED_INIT_EXTRA_FRAME_INFO_P ()
|| DEPRECATED_FRAME_CHAIN_P ()
|| !gdbarch_unwind_dummy_id_p (current_gdbarch)
|| !SAVE_DUMMY_FRAME_TOS_P ());
should return true, and hence get_prev_frame should call
legacy_get_prev_frame() which should always set ->unwind?
'set debug frame 1'
Will at least indicate which type of frame is being created.
(unless you're trying to get code to use the new unwinder that is, or
its some sort of inner most frame edge case?).
Andrew