#include "command.h"
#include "gdbcmd.h"
+/* Flag to control debugging. */
+
+static int frame_debug;
+
/* Flag to indicate whether backtraces should stop at main. */
static int backtrace_below_main;
Note, this is done _before_ the frame has been marked as
previously unwound. That way if the user later decides to
allow unwinds past main(), that just happens. */
- return NULL;
+ {
+ if (frame_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Outermost frame - inside main func.\n");
+ return NULL;
+ }
/* Only try to do the unwind once. */
if (next_frame->prev_p)
then it should probably be moved to before the ->prev_p test,
above. */
if (inside_entry_file (get_frame_pc (next_frame)))
+ {
+ if (frame_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Outermost frame - inside entry file\n");
return NULL;
+ }
/* If any of the old frame initialization methods are around, use
the legacy get_prev_frame method. Just don't try to unwind a
|| INIT_EXTRA_FRAME_INFO_P ()
|| FRAME_CHAIN_P ())
&& next_frame->level >= 0)
- return legacy_get_prev_frame (next_frame);
+ {
+ prev_frame = legacy_get_prev_frame (next_frame);
+ if (frame_debug && prev_frame == NULL)
+ fprintf_unfiltered (gdb_stdlog,
+ "Outermost frame - legacy_get_prev_frame NULL.\n");
+ return prev_frame;
+ }
/* Allocate the new frame but do not wire it in to the frame chain.
Some (bad) code in INIT_FRAME_EXTRA_INFO tries to look along
prev_frame->pc = frame_pc_unwind (next_frame);
if (prev_frame->pc == 0)
- /* The allocated PREV_FRAME will be reclaimed when the frame
- obstack is next purged. */
- return NULL;
+ {
+ /* The allocated PREV_FRAME will be reclaimed when the frame
+ obstack is next purged. */
+ if (frame_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Outermost frame - unwound PC zero\n");
+ return NULL;
+ }
prev_frame->type = frame_type_from_pc (prev_frame->pc);
/* Set the unwind functions based on that identified PC. */
save the frame ID directly. */
struct frame_id id = frame_id_unwind (next_frame);
if (!frame_id_p (id))
- return NULL;
+ {
+ if (frame_debug)
+ fprintf_unfiltered (gdb_stdlog,
+ "Outermost frame - unwound frame ID invalid\n");
+ return NULL;
+ }
prev_frame->frame = id.base;
}
the backtrace at \"main\". Set this variable if you need to see the rest\n\
of the stack trace.",
NULL, NULL, &setlist, &showlist);
+
+
+ /* Debug this files internals. */
+ add_show_from_set (add_set_cmd ("frame", class_maintenance, var_zinteger,
+ &frame_debug, "Set frame debugging.\n\
+When non-zero, frame specific internal debugging is enabled.", &setdebuglist),
+ &showdebuglist);
}